一 sql注入
原理:其实就是利用sqld的注释来骗过数据库去操作数据库
-- 是sql的注释,语法为:-- sql语句
1.1一个简单的登陆验证页面来验证用户名和用户密码
import pymysql user=input('用户名: ').strip() pwd=input('密码: ').strip() #链接 conn=pymysql.connect(host='localhost',user='root',password='123456',database='test',charset='utf8') #游标 cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示 #配置结果集为字典形式 #cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) #执行sql语句 sql='select * from user where username="%s" and password="%s"' %(user,pwd) #注意%s需要加引号 print(sql) res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目 print(res) cursor.close() conn.close() if res: print('登录成功') else: print('登录失败')
1.2sql注入演示
假如我的用户名存在的,不知道密码的情况下情况:
用户名与密码都不知道的情况下:
为什么能登陆成功?
#用户存在,绕过密码 select * from user where username="lqz" -- lqz zhuru" and password="123" #用户不存在,直接绕过: select * from user where username="liuqz" or 1=1 -- lqz zhuru" and password="123" #-- 是注释掉后面的sql,有什么也不会执行 # or 1=1 永远成立 #这样就绕过了用户名密码验证,就是我们常说的sql注入 解释
解决方案:
# 原来是我们对sql进行字符串拼接 sql="select * from user where username='%s' and password='%s'" %(user,pwd)print(sql)res=cursor.execute(sql) # 改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了) sql = "select * from user where usernamne=%s and password=%s" res = cursor.execute(sql, [user, pwd]) # pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。 # !!!注意%s需要去掉引号,因为pymysql会自动为我们加上