# 在 test 库中先创建一张 user 表
create table user (idint primary key auto_increment,
name char(16),
password varchar(32));
insert into user(name, password) values
("aoteman","asd"),("alterman","asdzxc");import pymysql
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
database="test",
user="root",
passwd="",# 数据库密码
charset="utf8")"""
+----+----------+----------+
| id | name | password |
+----+----------+----------+
| 1 | aoteman | asd |
| 2 | alterman | asdzxc |
+----+----------+----------+
"""
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 简易登录验证whileTrue:
username =input("username:>>")
password =input("password:>>")
sql ="select * from user where name='%s' and password='%s' "%(username, password)print(sql)
cursor.execute(sql)print(cursor.fetchall())
正常登录情况
非正常登录情况
'''
在上述演示的非正常登陆情况下,我们发现
一种是只知道 用户名就可以实现登录,并且该登录用户的返回密码
一种是不知道账号和密码的情况下,完成登录,并且获取所有用户的用户名和密码
'''
我们在分析 mysql 在上述两种情况中执行的代码分别是
select *from user where name='aoteman'#' and password=''
select *from user where name=''or1=1#' and password=''
分析执行的 sql 语句我们会发现这些非正常登录的情况是因为 用户巧妙运用了 mysql 的逻辑运算(or)和 注释符号 “#” 使得部分代码虽然存在但不执行,从而跳过了密码验证和用户名验证
数据库注入情况是比较常见的,比如说我们在注册一些账户的时候,会要求我们的用户名和密码不能包含一些特殊符号就是为了防止注入的情况出现。
sql 注入的解决方法
# 第一种方法就是在用户注册时明确不能包含特殊符号(适用性较差)# 第二种方法使用,pymysql 模块提供的方法
sql ="select * from user where name=%s and password=%s "
cursor.execute(sql,(username, password))
在演示中我们可以看到按照这种方法可以比较简单的避免 sql 注入的情况出现
pymysql补充内容
'''
增删改查中
删、改、增它们的操作涉及到数据的更改,没有办法直接执行,需要二次确认
'''# 执行多条 sql 语句
rows = cursor.executemany(sql,[("sekiro","123"),("ash","123456")])import pymysql
conn = pymysql.connect(
host ="127.0.0.1",
port =3306,
user ="root",
password ="",
charset ="utf8",
database ="test518",
autocommit =True# 自动提交)
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)# 增加数据
sql ="insert into user(name, password) values(%s, %s)"# rows = cursor.execute(sql, ("sekiro", "123"))# 执行多条 sql 语句
rows = cursor.executemany(sql,[("sekiro","123"),("ash","123456")])print(rows)# conn.commit() # 确认# 修改
sql ="update user set name='ash' where id = 1"
rows = cursor.execute(sql)print(rows)# conn.commit() # 确认# 删
sql ="delete from user where id = 1"
rows = cursor.execute(sql)print(rows)