6月14
sql注入及事务
MySQL知识点补充
1、去重 distinct
select distinct name,age from t1; # 针对查找出来的结果整行(记录)进行去重,也就是相同行只保存一个
注意点:distinct 必须放在查询列的第一个(放后面就会报错)
2、保存操作记录 tee
tee D:a.txt;
可以把你对于MySQL的所有操作都记录到D盘下的a.txt中(包括一些报错信息)
pymysql包的基本用法
基本的查看
import pymysql # 导入pymysql包 conn = pymysql.connect(host='localhost',user='root',password='123',database='db1',charset='utf8') # 连接mysql服务器,必须指定主机、用户、密码和你要使用的数据库 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 实例化拿到光标对象,可以对服务器发送sql语句 # cursor=pymysql.cursors.DictCursor是为了让输出变成字典(列名与值对应),不设置的话就是元组 sql = 'select * from t1 where id > %s'% 1 # 写的sql语句不需要封号结尾,如果需要给sql语句传参,需要通过%s传值 cursor.execute(sql) # 发送sql语句 cursor.fetchall() cursor.fetchone() cursor.fetchmany(2) # 都是拿数据 fetchall拿全部,fetchone拿一个,fetchmany拿多个自己指定 cursor.close() conn.close() # 使用完关闭资源
sql注入
含义:
sql指的就是太相信用户的输入,没有对用户输入的参数进行转义,导致用户根据sql语法的特点完成对账号的破解
案例
sql = "select * from t1 where name = '%s' and pwd = '%s'"%(name,pwd) # 例一:用户输入用户名时,输入heheh'# # 这时得到的sql语句是 "select * from t1 where name = 'heheh'#' and pwd = '%s'" # 在sql语句中 # 后面的语句是不执行的,所以就可以不输入密码轻松登录 # 例二:用户输入时输入 'asdsfa' or 1 = 1 # # 这时得到的sql语句是 "select * from t1 where name = 'asdsfa' or 1 = 1 #' and pwd = '%s'" # or在sql语句中是两边有一个正确就正确,也可以不输入密码登录成功
解决办法
1、自己手工对用户输入的值进行转义
2、使用execute() 自动进行过滤
# 插入一条数据 cursor.execute(sql,('hehhe','123')) # 插入多条可以通过一个列表装起来 data = [('head','123'), ('name','pwd')] cursor.executemany(sql,data)
事务*****
含义:
事务指的是一组操作,要么都成功,要么都失败
特性
1、原子性
一组操作,要么都成功,要么都失败
2、一致性
指事务发生前后的数据总额不变
3、隔离性
简单来说,指某个事物的操作对其他事物不可见
4、持久性
当事务完成后,其影响是保存下来,不能撤销,只能通过开启另一个事务来抵消之前的错误
使用场景
当银行转账时,就需要用来事务,不然会发生一端钱刚扣,另一端还没增加就断电了,不加事务这钱就没了
加了事务,当这两个操作有一个没完成,那这两个都没完成。
代码
在mysql中创建事务方式
start transaction #开启事务 (中间执行sql操作...) commit # 提交上面的sql,让其生效 rollback # 回滚,撤回操作
ps:如果中间的sql语句中有drop表的操作,rollback就回不来了
在pymsql中
在pymsql中本身就包含了事务的处理,不过需要我们手动提交commit 或者rollback才行
连接mysql服务器的时候会有一个连接的返回值(连接对象)
当我们要执行一些增加、修改、删除操作时,需要通过连接对象提交commit或者rollback才行
当然,rollback时回滚,一般写在抓取到sql语句异常之后