sql注入问题(mysql)
mysql中的sql注入问题
1、为什么会出现这种问题?
利用特殊符号和注释语法来绕过sql校验
演示:通过用户输入的用户名和密码来使用数据库校验
import pymysql
# 与MySQL数据库建立连接
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
passwd="123",
db="data",
charset="utf8",
autocommit=True
)
# 获取游标对象
cursor_obj = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 用户输入的用户名和密码
username = input("请输入用户名>>> ").strip()
password = input("请输入密码>>> ").strip()
# 提交数据并检验用户名密码
sql = "select * from userinfo where username='%s' and password='%s'" % (username, password) # 根据用户名和密码来查询是否存在这条数据
print(sql)
cursor_obj.execute(sql)
res = cursor_obj.fetchall()
if res:
print(res)
else:
print("用户名或密码错误!")
# 关闭游标
cursor_obj.close()
# 关闭客户端连接
conn.close()
演示第一种执行结果(在知道用户名、不知道密码的情况下,获取该用户的信息):
这样看sql语句可能看不出来什么,那么将这一串输出的sql语句放到Navicat中来看一下:
同一份代码,演示第二种执行结果(在不知道用户名、也不知道密码的情况下,获取所有用户的信息):
将这一串输出的sql语句放到Navicat中来看一下:
2、解决方法
关键性的数据,不要自己手动去拼接,而是交给execute()去做拼接
import pymysql
# 与MySQL数据库建立连接
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
passwd="123",
db="data",
charset="utf8",
autocommit=True
)
# 获取游标对象
cursor_obj = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 用户输入的用户名和密码
username = input("请输入用户名>>> ").strip()
password = input("请输入密码>>> ").strip()
# 提交数据并检验用户名密码
sql = 'select * from userinfo where username=%s and password=%s' # 这里只能用%s来格式化数据,因为后面的execute()只能识别语句中的%s
print(sql)
cursor_obj.execute(sql, (username, password)) # 在execute()方法中传入username, password参数
res = cursor_obj.fetchall()
if res:
print(res)
else:
print("用户名或密码错误!")
# 关闭游标
cursor_obj.close()
# 关闭客户端连接
conn.close()
演示第一种执行结果(在知道用户名、不知道密码的情况下,获取该用户的信息):
演示第二种执行结果(在不知道用户名、也不知道密码的情况下,获取所有用户的信息):
正确演示: