对于在输入用户名密码等需要用户自行输入内容并在mysql数据库中查询的语句,sql注入是一种常见的被攻击方式。
#数据表场景
create table userinfo(id int primary key auto_increment,user_name char(10),password char(10));
insert into userinfo(user_name,password) values("gaga","123"),("mb","234");
#模拟用户登录场景
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "root",
password="123",
database="test",
charset="utf8"
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
while 1:
user_name_input = input("请输入用户名:")
password_input = input("请输入密码:")
sql = "select * from userinfo where user_name = '%s' and password = '%s';"%(user_name_input,password_input)
ret = cursor.execute(sql)
if ret:
print("登陆成功")
else:
print("用户名或密码错误")
这样就模拟出了一个登录场景
此时如果知道某一个用户名不知道密码
输入账户名时输入gaga’;-- (注意有个空格)密码随便输入一个,就可以登陆成功。
这是因为输入gaga’,-- 给sql语句拼凑出了
“select * from userinfo where user_name = ‘gaga’;-- and password = 3213213”
这样的字符串,在实际执行过程中会执行
select * from userinfo where user_name = ‘gaga’;
后面的都算注释,所以随便一个密码都可以登录
如果连账户也不知道,在用户名位置输入dsad’ or 1=1;–
密码也随便输入一个,也可以登陆成功。
这是因为输入dsad’ or 1=1;-- 给sql语句拼凑出了
“select * from userinfo where user_name = ‘dsad’ or 1=1;-- and password = 3213213”
解决
一般的解决方式是限制输入内容,利用正则表达式等方法不允许用户输入特殊符号,或者自动去掉特殊符号。
pymysql中的解决办法是自动去掉特殊符号
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "root",
password="123",
database="test",
charset="utf8"
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "root",
password="123",
database="test",
charset="utf8"
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
while 1:
user_name_input = input("请输入用户名:")
password_input = input("请输入密码:")
sql = "select * from userinfo where user_name = %s and password = %s;"
# "select * from userinfo whereuser_name = 'gaga';--
ret = cursor.execute(sql,[user_name_input,password_input])
if ret:
print("登陆成功")
else:
print("用户名或密码错误")