sql注入

一  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会自动为我们加上
原文地址:https://www.cnblogs.com/zhaijihai/p/10206997.html