• day-44mysql


    sql注入

            a. 登录验证
                
                写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 ;
            
  • 相关阅读:
    httpd添加新模块
    编译httpd细节
    apache配置文件说明及一些指令
    xen原理
    EXSI的使用
    VMWare ESX server安装
    虚拟化技术
    Kvm命令集管理虚拟机
    RAID几种方式
    BZOJ1011 [HNOI2008]遥远的行星 【奇技淫巧】
  • 原文地址:https://www.cnblogs.com/klw1/p/11032644.html
Copyright © 2020-2023  润新知