• 视图+sql注入+事务+存储过程


    视图本质上是一张虚拟的表,数据来自select语句

    使用视图可以保证原表的安全:
    功能1,影藏部分数据 开放指定的数据
    功能2,因为视图可以将查询结果保存特性 我可以用视图 来达到减少书写sql的次数

    视图的使用,创建视图:
    create view test_view as select *from t1;

    特点:
    1.每次对视图进行的查询 其实都是再次执行了 as 后面的查询语句
    2.可以对视图进行修改 修改会同步到原表
    3.视图是永久存储的 存储的不是数据 而就是一条 as sql语句

    基本不用 因为程序开放的数据,不是开放sql语句,而开放的是查询结果



    sql注入攻击:
    黑客可以输入一些关键字 或合法sql 来导致原始的sql逻辑发生变化 从而跳过登录验证 或者 删除数据库

    避免的方式
    在接受用户输入的数据时 可以加上限制 比如 不能输 -- ' ; where 等等
    上面这种方式 只能避免 黑客 从你的客户端软件注入 sql
    但是无法避免 中间人攻击(在你的客户端和服务器中间加一个中转服务器)
    这样就绕过了客户端的输入限制 此时 只能将 sql合法性验证放在服务器端

    总结: python避免sql注入,把slq(用户输入的)参数 放execute函数的arg参数中 让pymysql 自动帮你屏蔽注入攻击



    事务其实就是一组sql语句集合
    事务的特性
    1.原子性
    事务是一个整体 不可分割
    2.隔离性
    事务之间要相互隔离 为了维护数据完整性

    因为并发访问 导致的一些问题:
    1.脏读 一个事物 读到了 另一个事务未提交的数据 查询 之前要保证 所有的更新都已经完成
    2.幻读 一个查询事务没有结束时 数据被另一个事务 执行insert delete
    3.不可重复读 一个事物在查询 另一个事务在 update

    四种隔离级别:
    读未提交
    读已提交
    可重复读 默认
    串行化

    3.一致性
    当事务执行后 所有的数据都是完整的(外键约束 非空约束)
    4.持久性
    一旦事务提交 数据就永久保存

    强调: 事务就是一堆sql语句的集合 它们是原子性的 要么全部执行 要么都不执行
    mysql这个客户端 默认 开启自动提交 一条sql语句就是一个单独的事务
    pymysql 默认是不自动提交 需要手动commit 意思是默认就开启了事务

    事务主要语句:
    start transaction; 开启一个事物
    commit 提交事物
    rollback 回滚事务



    存储过程可以理解为mysql的编程语言

    存储过程的作用:
    可以将程序的业务逻辑 放到mysql中来处理,这样可以降低网络访问次数 从而提高你的程序效率


    三种开发的模型:
    1. 应用程序 处理逻辑
    应用程序开发者需要编写 sql语句
    优点:执行效率高
    缺点: 开发效率低

    2. mysql 处理逻辑
    特点: mysql开发者编写 sql语句
    优点: 应用程序开发效率高
    缺点: 执行效率略低,沟通成本增高

    3.使用 ORM(object relation map) 对象关系映射
    自动帮你生成对应的sql语句 比如你要注册用户 本来要写insert 语句 现在使用orm调用save(用户对象)
    优点:开发效率高
    缺点:执行效率降低


    存储过程相当于python中的一个函数
    简单地说 学习存储过程就是 学习如何使用mysql编写一个函数

    语法:
    create procedure 过程的名称 ({in,out,inout} 数据类型 参数名称)
    begin
    具体的sql代码
    end
    参数前面需要指定参数的作用
    in 表示该参数用于传入数据
    out 用于返回数据
    inout 即可传入 也可返回

    案例:创建一个存储过程 作用是将两个整数相加 将结果保存在变量中
    结束符更换为//
    delimiter //
    定义一个变量
    set @su = 100;
    创建函数
    create procedure add_p2 (in a int,in b int,out su int)
    begin
    set su = a + b;
    end
    调用过程
    call add_p2(10,20,@su);

    调用存储过程 使用 call 过程名称

    注意 在存储过程中 需要使用分号来结束一行 但是分号有特殊含义
    得将原始的结束符 修改为其他符号



    mysql中的if语句
    if 条件 then
    代码
    elseif 条件 then
    代码
    else then
    代码
    end if;


    其他的流程控制
    switch
    case
    while
    repeat == do while

    总结: 实际上一个mysql中的类似函数的东西 我们可以用它实现一些逻辑处理
    特点:里面可以包含流程控制语句 和 普通的sql语句
    使用存储过程的优势
    提高应用程序开发效率
    降低网络访问次数
  • 相关阅读:
    Android listview 的应用
    Android 创建自定义布局
    Android Dialog
    android ProgressBar
    Lilac Pwn stack4-stack_pivoting Writeup
    CTFHUB Pwn ret2shellcode Writeup
    Lilac Pwn stack3-rop Writeup
    函数调用过程与栈帧结构
    线性回归及Python实现
    Google Kick Start Round A 2020
  • 原文地址:https://www.cnblogs.com/liangchengyang/p/9669539.html
Copyright © 2020-2023  润新知