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语句异常之后

posted @ 2019-06-18 22:39  huikejie  阅读(204)  评论(0编辑  收藏  举报