Bootstrap

SQL注入示例及避免

需求:

假如,你开发了一个用户认证的系统,应该用户登录成功后才能正确的返回相应的用户结果。

创建表:

添加数据:

示例代码:

import pymysql

# 输入账号和密码
user = input('请输入用户名:')
password = input('请输入密码:')

conn = pymysql.connect(host='192.168.1.9', port=3306, user='root', password='root12345678', charset='utf8', db='new_database')
cursor = conn.cursor()

# 基于字符串格式化来拼接sql语句
sql = "select * from students where name='{}' and password='{}'".format(user, password)
print(sql)
cursor.execute(sql)

result = cursor.fetchone()
print(result)

cursor.close()
conn.close()

运行结果:

如果用户在输入user时,输入了:' or 1=1 -- ,这样即使用户输入的密码不存在,也会可以通过验证。

注意:sql语句中--表示注释,--后需要有个空格再添加注释内容

那么,在Python开发中如何来避免SQL注入呢?

切记,SQL语句不要在使用python的字符串格式化,而是使用pymysql的execute方法。

示例代码:

import pymysql

# 输入账号和密码
user = input('请输入用户名:')
password = input('请输入密码:')

conn = pymysql.connect(host='192.168.1.9', port=3306, user='root', password='root12345678', charset='utf8', db='new_database')
cursor = conn.cursor()

# cursor.execute("select * from students where name=%s and password=%s", [user, password])
# 或者
cursor.execute("select * from students where name=%(name)s and password=%(password)s", {'name': user, 'password': password})

result = cursor.fetchone()
print(result)

cursor.close()
conn.close()

运行结果:

;