sql注入与防止SQL注入之参数化处理

Posted zjbacke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入与防止SQL注入之参数化处理相关的知识,希望对你有一定的参考价值。

sql注入的两种情况:

操作代码:

import pymysql

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

# 链接
conn = pymysql.connect(host=localhost, user=root, password=123, database=db1, charset=utf8)
# 游标
cursor = conn.cursor()  # 执行完毕返回的结果集默认以元组显示
# cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)


# 执行sql语句
sql = select * from t1 where name="%s" and pwd="%s" % (user, pwd)  # 注意%s需要加引号
print(sql)
res = cursor.execute(sql)  # 执行sql语句,返回sql查询成功的记录数目
print(res)

cursor.close()
conn.close()

if res:
    print(登录成功)
else:
    print(登录失败)

正常情况

用户名: zj
密码: 123
select * from t1 where name="zj" and pwd="123"
1
登录成功

sql注入 

  1、sql注入之:用户存在,绕过密码

用户名: zj" -- saaa
密码: a
select * from t1 where name="zj" -- saaa" and pwd="a"
1
登录成功

  2、sql注入之:用户不存在,绕过用户与密码

用户名: 12e" or 1=1 -- asddas
密码: 
select * from t1 where name="12e" or 1=1 -- asddas" and pwd=""
1
登录成功

 

防止SQL注入之参数化处理

优化后的代码

import pymysql

user = input(用户名: ).strip()
pwd = input(密码: ).strip()
# 打开数据库连接
conn = pymysql.connect(host=localhost, user=root, password=123, database=db1, charset=utf8)

# 创建一个游标对象
cursor = conn.cursor()

# 参数化处理

sql = "select * from t1 where name=%s and pwd=%s"  # 注意%s需要去掉引号,因为pymysql会自动为我们加上

print(sql)
res = cursor.execute(sql, [user, pwd])  # 执行sql语句,返回sql查询成功的记录数目
print("res:", res)

# 关闭游标
cursor.close()
# 关闭数据库
conn.close()

if res:
    print(登录成功)
else:
    print(登录失败)

正确输入

用户名: zj
密码: 123
select * from t1 where name=%s and pwd=%s
res: 1
登录成功

sql注入,失败示例

用户名: zj" -- sad
密码: a
select * from t1 where name=%s and pwd=%s
res: 0
登录失败

 

以上是关于sql注入与防止SQL注入之参数化处理的主要内容,如果未能解决你的问题,请参考以下文章

参数化查询为什么能够防止SQL注入 (转)

如何防止sql注入攻击?

MyBatis怎么防止SQL注入

怎么防止SQL注入?

这个参数化查询如何防止 SQL 注入?

参数化查询防止Sql注入