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

  • 相关阅读:
    2月8日
    2月7日
    2月6日
    2月5日
    事务
    synchronized关键字详解(二)
    synchronized关键字详解(一)
    java.sql.SQLException: Access denied for user 'somebody'@'localhost' (using password: YES)
    wex5 教程 之 图文讲解 wex5集成HTML5 视频播放器
    wex5 实战 加密与解密系列(1) DES算法引入与调用
  • 原文地址:https://www.cnblogs.com/huikejie/p/11048329.html
Copyright © 2020-2023  润新知