课堂小作业
使用navicat(也可以用其他的)数据库工具在db3数据库里简单的建一个账号密码表,插入数据,建表语句如下:
CREATE TABLE login (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL
);
用python实现一个可以进行SQL注入的简单代码
import pymysql
# 存在SQL注入
# SQL注入语句 username:任意 password(万能密码):1' or 1=1 #
if __name__ == "__main__":
# 连接数据库
conn = pymysql.connect(host='localhost',
user='root', #自己的数据库账号
password='123456', #数据库密码
database='db3', #名字
charset='utf8')
cur = conn.cursor() # 生成游标对象
try:
username = input("please input username:")
password = input("please input password:")
# 使用拼接SQL语句
sql = "select * from login where username='"+username+"'and password='"+password+"'"
print(sql)
cur.execute(sql)
datas = cur.fetchone()
if not datas:
print('login fail!')
else:
print("login success!")
conn.commit() # 提交事务
except Exception as e:
conn.rollback()
print('操作失败:', e)
finally:
cur.close() # 关闭游标和数据库连接
conn.close()
输入账号密码尝试登录看看是否正常:
接下来输入错误的账号密码看看运行结果,可以看到登入失败:
接下来进行SQL注入尝试登入,可以看到注入成功:
要防止SQL注入,就要避免使用拼接语句,修改如下:
import pymysql
# 不使用拼接语句
if __name__ == "__main__":
# 连接数据库
conn = pymysql.connect(host='localhost',
user='root',
password='123456',
database='db3',
charset='utf8')
cur = conn.cursor() # 生成游标对象
try:
username = input("please input username:")
password = input("please input password:")
params = (username,password)
# 使用参数化查询
sql = "select * from login where username= %s and password= %s"
print(sql)
cur.execute(sql,params)
datas = cur.fetchone()
if not datas:
print('login fail!')
else:
print("login success!")
conn.commit() # 提交事务
except Exception as e:
conn.rollback()
print('操作失败:', e)
finally:
cur.close() # 关闭游标和数据库连接
conn.close()
输入账号密码,可以看到登入成功:
进行SQL注入,此时登入失败:
总结:参数化查询将用户输入作为参数传递给SQL语句,而不是直接拼接到SQL语句中。这样可以确保用户输入被正确转义,防止恶意代码被执行。