• MySQLStudy——SQL注入 事务 视图 函数 触发器


    SQL注入 

    登录验证时的SQL注入攻击

    写sql语句的时候, %传值的时候, 需要加引号:

    sql = "select * from t4 where name = '%s' and pwd = '%s'" % (username, pwd)

    上面的sql语句带来的风险是:

    例一:
    username = zekai' #
    
    select * from t4 where name = 'zekai' #' and pwd = ''
    
    例二:
    username = dbsahvbdsha' or 1=1 #
    
    select * from t4 where name = 'dbsahvbdsha' or 1=1 

    上面出现的问题,我们称之为 SQL注入 

    出现问题的根源是:
    因为太过于相信用户的输入, 导致我们在接受用户输入的参数的时候, 并没有对他进行转义

    解决SQL注入

    1. 自己手工对用户输入的值进行转义

    2. 使用execute()自动进行过滤,游标执行时自动以字符串形式传入变量

    sql = "select * from t4 where name = %s and pwd = %s"
    
    cursor.execute(sql,(username, pwd))
    
    #$## 插入一条
    cursor.execute(sql, ('lxxx', '1234'))
    
    ### 插入多条
    data = [
    ('aaaaa', 'aaa'),
    ('bbbb', 'bbb'),
    ('ffff', '666'),
    ('rrrr', '888'),
    ]
    cursor.executemany(sql, data)
    
    
    try:
    cursor.execute(sql, ('lxxx', '1234'))
    
    ### 删除和更新的时候, 需要事物提交
    conn.commit()
    except Exception as e:
    conn.rollback()
    
    
    cursor.lastrowid : 最后一行的行数

    事务

    简要概括:一组操作, 要么都成功, 要么都失败

    特性

    原子性: 一组操作, 要么都成功, 要么都失败
    一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配
    隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的
    持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“另开起一个事物”来抵消之前的错误

    使用场景

    思考:
    我去银行给朋友汇款,
    我卡上有1000元,
    朋友卡上500元,
    我给朋友转账100元(无手续费),
    如果,网线断了, 我的钱刚扣,而朋友的钱又没加时, 怎么办?

    建表:

    create table t11 (
    id int auto_increment primary key,
    name varchar(32) not null default '',
    money int not null default 0
    )engine=Innodb charset=utf8;
    
    insert into t11 (name,money) values ('zekai', 1000), ('eagon', 500);

    解决方法


    开启事务 (start transaction)

    (执行sql操作)

    commit : 提交上面的SQL, 让其生效

    rollback: 回滚

    show full tables; 显示全部类型

    视图

    产生的原因

    如果有一个SQL语句频繁的会被使用到,比如说:
    select * from t4 where id>12 and id <24;

    搞一个映射,或者取一个别名
    select * from t4 where id>12 and id <24 === > v1
    视图

    select * from v1;

    创建视图

    create view v1 as select * from t4 where id>12 and id <24;

    修改视图

    alter view v1 as sql语句;

    删除视图

    drop view v1;

    问题

    如果原生的表数据发生了变化, 那视图会不会发生变化? 也会变化

    视图中的数据会不会发生修改? 答案: 不会发生修改!!!

    应用场景

    MySQL: (DBA)
    生成视图View

    程序:
    调用 select * from v1;

    函数

    不要轻易使用


    在程序中, 用代码计算, 计算好了, 再传给SQL语句执行

    存储过程

    将一大堆 SQL 语句进行封装, 类似于函数, 结果就是存储过程

    MySQL服务端:
    DBA (写)

    a. 简单的存储过程:

    delimiter //
    
    create procedure p1()
    BEGIN
    select * from t11;
    END //
    delimiter ;
    
    程序:
    call p1();

    b. 传参数: (in)

    delimiter //
    create procedure p2(
    in n1 int,
    in n2 int
    )
    BEGIN
    select * from t11 where id > n1;
    END //
    delimiter ;
    
    程序:
    call p2(12, 2)

    c. 传入参数: (out)

    delimiter //
    
    create procedure p3(
    in n1 int,
    out n2 int
    )
    BEGIN
    select * from t11 where id > n1;
    set n2 = 1;
    END //
    delimiter ;
    
    
    set @v2=123212;
    call p3(12, @v2);
    
    select @v2;

    触发器

    向用户表中添加一条数据的同时, 在日志表中也添加一条记录

    delimiter //
    CREATE TRIGGER t1 BEFORE INSERT ON t7 FOR EACH ROW
    BEGIN
    insert into t11 (name, money) values ('xxx', 1234);
    END //
    delimiter ;
  • 相关阅读:
    从传统BI报表系统上重构指标库
    autoload魔术方法的妙用
    kerberos委派详解
    一篇文章弄懂session的两种存储方式
    一款专门针对高质量女性的易语言钓鱼样本简单分析
    长城杯线上赛wp
    羊城杯WP
    ICMP隧道通信原理与通信特征
    浅析栈溢出遇到的坑及绕过技巧
    从本地到WordPress代码注入
  • 原文地址:https://www.cnblogs.com/tingguoguoyo/p/11041003.html
Copyright © 2020-2023  润新知