python使用mysql,sql注入问题
python使用mysql
import pymysql conn = pymysql.connect( host = '127.0.0.1', # 连接地址 port = 3306, #端口 user = root, #用户名 password = '', #密码 database = 'db', #库名称 charset = 'utf8' #编码格式 utf8,不是utf-8 ) cursor = conn.cursor(pymsql.cursors.DictCursor) #产生一个游标,以字典的形式返回查询出来的数据,键是表的字段,值是表字段对应的信息 sql = select * from userinfo # 写sql语句 cursor.execute(sql) # 执行传入的sql语句 print(cursor.fetchone()) #拿到表中一条数据 print(cursor.fetchone()) print(cursor.fetchone()) cursor.scroll(1,'absolute') #absolute绝对移动,前面数字写几,就相对于起始位置向后移动几位 cursor.srcoll(1,'relative') #relative相对移动,前面写几,就相对于当前位置向后移动几位 print(cursor.fetchall()) #拿到表中所有的数据
sql注入问题
conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) username = input('请输入用户名:') password = input('请输入密码:') sql = "select * from userinfo where name = '%s' and password ='%s'" %s(username, password) res = cursor.execute(sql) if res: print(cursor.fetchall()) else: print('账号或密码错误')
我们用上述一段代码诠释一下sql注入的问题, 当我们输入正确的账号密码的时候,发现可以正常打印字段数据,当我们输入错误账号或密码时,就显示账号密码错误
以我们只知道用户名为例
竟然查到了用户的所有信息,这个是根据 -- 注释做到的sql注入
假如我们账号密码都不知道,那么如何用sql注入去获取网站的用户信息呢
在我们对账号密码毫不知情的情况下,我们使用or判断条件的成立,再加上 --注释,可以获取到网站所有的用户信息
根据以上两个问题我们应该如何解决呢?
conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) username = input('请输入用户名:') password = input('请输入密码:') sql = "select * from userinfo where name = %s and password =%s" res = cursor.execute(sql,(username,password)) # execute可以自动识别sql语句中的%s,它可以帮助你过滤特殊的字符,避免sql注入的问题 if res: print(cursor.fetchall()) else: print('账号或密码错误')
总结:
1.sql注入,就是利用注释等具有特殊意义的符号,来完成的
2.后续写sql语句时,不要手动去拼接关键性的数据,而是交由execute去拼接
python对mysql的增,改,删操作
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) sql = "insert into user(name,password) values('wu','123') " #插入,增 cursor.execute(sql) conn.commit() 在新增时要写conn.commit()
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) sql = "update user set name='qazqaz' where id = 1 " #修改 cursor.execute(sql) conn.commit() #在修改时要写conn.commit()
import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = root, password = '', database = 'db', charset = 'utf8' ) cursor = conn.cursor(pymsql.cursors.DictCursor) sql = "delete from user where id = 1 " #删除 cursor.execute(sql) conn.commit() #在删除时要写conn.commit()