mysql注入
假如你开发了一个用户认证系统,应该用户登录后才能返回相应的结果
# -*- coding: UTF-8 -*-
"""
@Project :pythonProject
@File :sql注入.py
@IDE :PyCharm
@Author :于金龙@阿龙的代码在报错
@Date :2024/8/27 下午4:01
"""
import pymysql
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
passwd="20020115",
db='user',
charset='utf8')
cursor = conn.cursor()
def log_on():
name = input('输入用户名')
password = input('输入密码')
sql = f'select name,password from users where name={name} and password={password}'
cursor.execute(sql)
user = cursor.fetchall()
if user:
print('登录成功')
else:
print('密码或账号不匹配')
if __name__ == '__main__':
log_on()
但是当我们在输入用户名的时候输入"" or 1=1 --
不同输入对用户名和密码也可以登录成功 (如图所示)
mysql> select * from users;
+----+---------------+----------+
| id | name | password |
+----+---------------+----------+
| 1 | yujinlong2002 | 20020115 |
| 2 | admin | admin |
| 3 | 2 | 2 |
+----+---------------+----------+
3 rows in set (0.00 sec)
可以在我们的数据表中是没有的
原因:
当我们输入的的用户名是和sql的关键字组成的一个完整的sql语句拼接的结果是:
select * from users where name='' or 1=1 -- password=1;
提示:在MySQL中--
表示的是注释,注释后的内容MySQL就不会在执行了
所以这段语句的意识就是查询name=’ ’ 或者 1=1,或者只要有一边正确就为正,所以这段sql就相当于select * from users
,
然后就理所当然的登录成功了。
如何尽力避免sql注入的问题
在sql语句中我们尽力不用使用python的字符串格式化,尽力使用pymysql中的exectue的方法
import pymysql
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
passwd="20020115",
db='user',
charset='utf8')
cursor = conn.cursor()
def log_on():
name = input('输入用户名')
password = input('输入密码')
cursor.execute('select name,password from users where name=%s and password=%s', (name, password))
user = cursor.fetchall()
if user:
print('登录成功')
else:
print('密码或账号不匹配')
ursor.fetchall()
if user:
print(‘登录成功’)
else:
print(‘密码或账号不匹配’)