sql注入问题(mysql)[Python基础]

python

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()

  演示第一种执行结果(在知道用户名、不知道密码的情况下,获取该用户的信息):

  演示第二种执行结果(在不知道用户名、也不知道密码的情况下,获取所有用户的信息):

 

   正确演示:

以上是 sql注入问题(mysql)[Python基础] 的全部内容, 来源链接: utcz.com/z/530592.html

回到顶部