需求:
假如,你开发了一个用户认证的系统,应该用户登录成功后才能正确的返回相应的用户结果。
创建表:
添加数据:
示例代码:
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()
运行结果: