Mysql数据库之sql漏洞注入


sql漏洞注入是利用sql语句拼接字符串造成入侵者不输入密码甚至不输入用户名就能登录。

# 导入pymsql模块
import pymysql

user=input("用户名:")
pwd=input("密码:")

# 步骤一:python创建与mysql的连接
conn=pymysql.connect(host="127.0.0.1",user="root",password="123456",database="test")
# 步骤二:创建一个游标对象
get_cursor=conn.cursor()
sql="select * from userinfo2 where name='%s' and pwd='%s'" %(user,pwd)
# 步骤三:使用游标对象中的execute方法执行sql语句
get_cursor.execute(sql)
# 步骤四:将查询出的结果取出来
result=get_cursor.fetchone()

if result:
    print("登录成功!")
else:
    print("登录失败!")

通过上述代码中:假设用户名是:user,密码:123456

在通过输入用户名和密码正确的情况下,登录成功;只要有一个不正确,那么就登录失败。那么如何才能在不知道用户名和密码的情况下登录成功呢?如下:

首先我们输入正确的用户名和密码,得到的sql语句:select * from userinfo2 where name='user' and pwd='123456';

但是如果我们这样输入,也可以登录:abcdefg' or 1=1 --'

这种输入的话,得到的sql语句是:select * from userinfo2 where name='abcdefg' or 1=1 --' and pwd='123456';  这句话是绝对成立的,原因是后面的--将密码给注释掉了,前面的两个条件中,无论name什么值,在1=1是绝对正确的,查询数据库中所有的数据。

 

防止sql漏洞注入的方法

不要使用上面的字符串拼接的方法进行使用sql语句,而是要使用如下方法(将上面的方法修改):

方法一:使用元组或列表的方法代替字符串拼接

sql="select * from userinfo2 where name=%s and pwd=%s"
get_cursor.execute(sql,[user,pwd])

方法二:使用execute提供的方法中的参数代替字符串拼接

sql="select * from userinfo2 where name=%s and pwd=%s"
get_cursor.execute(sql,user,pwd)

方法三:使用字典的方法代替字符串拼接

sql="select * from userinfo2 where name=%(a)s and pwd=%(b)s"
get_cursor.execute(sql,{'a':user,'b':pwd})

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM