zoukankan      html  css  js  c++  java
  • 视图+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语句
    使用存储过程的优势
    提高应用程序开发效率
    降低网络访问次数
  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/liangchengyang/p/9669539.html
Copyright © 2011-2022 走看看