Python中操作sql---pymysql库

1>基本用法,类似之前的套接字通信,也就是先建立连接,connect()方法,建立连接肯定需要

    主机地址,端口号,登陆的账号密码,数据库名称,指定字符编码等信息了,

    再拿到游标,再调取游标的execute()方法执行sql语句,此时得到的结果并不是我们查到的数据记录

    而是这个sql的执行结果,若要去数据,要用游标下面的方法去取,

    例子如下:

Python中操作sql---pymysql库_第1张图片

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注入

    先创建一个表

    Python中操作sql---pymysql库_第2张图片

    再创建远程登录战账户

    Python中操作sql---pymysql库_第3张图片

    字符串拼接的方式,传入用户名和密码,与数据库的进行对比,若一致,也就是sql执行成功,则打印登录成功

    否则就打印登录失败。

    Python中操作sql---pymysql库_第4张图片

    Python中操作sql---pymysql库_第5张图片

    3.1>绕过密码

    如下,在正确的账户后添加一个双引号,空格,-- ,后面接任意字符,就实现了跳过密码登录成功

    Python中操作sql---pymysql库_第6张图片

    解析:huang后面的引号跟sql中的前面单个引号刚好组成一对,后面就全部注释了,所以整条sql只进行了

    账号校验,并且账号是正确的,所以成功登录了

    3.2>绕过账号

    Python中操作sql---pymysql库_第7张图片

    解析:账号后面加入用or连接一个永远为真的条件,密码注释,组成的sql就把账号校验也跳过了,成功登录。

    3.3>解决之法:

    登录网站可以对账户名和密码进行校验,不允许包含这类特殊字符,或者接收后做相应处理

    pymysql也有一套处理方法

    如上,抓住这了漏洞的缘由就是这这两个%s传值(用户和密码)两边的引号引起的,所以攻击者能自己

    “组装”sql语句,去掉占位符的引号不就好了?

    原来写法:

    

    改写一下:由游标来传值

    

    验证

    Python中操作sql---pymysql库_第8张图片

    Python中操作sql---pymysql库_第9张图片

    

你可能感兴趣的:(python学习)