1>基本用法,类似之前的套接字通信,也就是先建立连接,connect()方法,建立连接肯定需要
主机地址,端口号,登陆的账号密码,数据库名称,指定字符编码等信息了,
再拿到游标,再调取游标的execute()方法执行sql语句,此时得到的结果并不是我们查到的数据记录
而是这个sql的执行结果,若要去数据,要用游标下面的方法去取,
例子如下:
2>其他相关
游标下面的方法
cur.fetchone():获取返回结果的第一行数据,括号不需要参数
cur.fetchmany(3):获取返回结果的前3行数据,括号需要参数
cur.fetchall():获取返回结果的所有数据,括号不需要参数
使用字典进行connect()参数管理
原来写法:connection = pymysql.connect(host='192.168.1.222',user='root',passwd='root',port=3306)
现在写法:config = {'host':'192.168.1.222','user':'root','passwd':'root','port':3306}
connection = pymysql.connect(**config)
移动游标
cur.scroll(1,mode='relative') # 相对当前位置移动,正数为向下移动,负数为向上移动
cur.scroll(1,mode='absolute') # 相对绝对位置移动,0表示第一行数据
设置游标为字典类型(返回结果默认是元祖类型,这个设置可以让返回结果变成字典类型)
之前写法:cur = conn.cursor() #默认不带参数,返回元祖类型数据
现在写法:cur = conn.cursor(cur=pymysql.cursors.DictCursor)
3>sql注入
先创建一个表
再创建远程登录战账户
字符串拼接的方式,传入用户名和密码,与数据库的进行对比,若一致,也就是sql执行成功,则打印登录成功
否则就打印登录失败。
3.1>绕过密码
如下,在正确的账户后添加一个双引号,空格,-- ,后面接任意字符,就实现了跳过密码登录成功
解析:huang后面的引号跟sql中的前面单个引号刚好组成一对,后面就全部注释了,所以整条sql只进行了
账号校验,并且账号是正确的,所以成功登录了
3.2>绕过账号
解析:账号后面加入用or连接一个永远为真的条件,密码注释,组成的sql就把账号校验也跳过了,成功登录。
3.3>解决之法:
登录网站可以对账户名和密码进行校验,不允许包含这类特殊字符,或者接收后做相应处理
pymysql也有一套处理方法
如上,抓住这了漏洞的缘由就是这这两个%s传值(用户和密码)两边的引号引起的,所以攻击者能自己
“组装”sql语句,去掉占位符的引号不就好了?
原来写法:
改写一下:由游标来传值
验证