SQL注入问题

本质:利用特殊符号的组合产生特殊的含义,从而避开正常的业务逻辑

select * from userinfo where name='jason' -- kasdjksajd' and pwd=''
select * from userinfo where name='xyz' or 1=1 -- aksdjasldj' and pwd='' 比如这样:用户可以通过输入 sql符号从而避开正常业务逻辑 如何避免: 针对上述的SQL注入问题 核心在于手动拼接了关键数据 交给execute处理即可 sql = " select * from userinfo where name=%s and pwd=%s "
cursor.execute(sql, (username, password))
# 使用execute(sql,根据%号位置传参 ) 使用这个方法来传参执行sql '在sql拼接方面要注意不能直接拼接,应该使用cursor.execute方法' execute(执行) 该方法会自动过滤用户输入的特殊字符

触发器trigger

达到某个条件之后自动触发执行
在Mysql中 更加详细的说明是 触发器 :针对表的增 删 改操作能够自动触发 主要有6种情况触发情况:
增前 before insert 增后 after insert
删前 before delete 删后 after delete
改前 before update 改后 after update create trigger 定义一个触发器名字 定义触发情况 on 表名
for each row begin sql语句 end 当达到触发条件是 执行 sql语句 1、触发器命名规律 一般都是以 tri_ + 触发条件 + 表名
tri_before_insert_t1
tri_after_update_t1 2. 临时修改sql语句的结束符 因为有些操作中可能要用到分号 触发器代码实操 create table cmd (
id int primary key auto_increment,
name char(32),
cmd char(32),
sub_time datetime,
success enum('yes','no')
); create table errlog(
id int primary key auto_increment,
err_cmd char(32),
err_time datetime
); delimiter $ 将mysql默认的结束符换为 $ delimiter 定义结束符 create trigger tri_after_insert_cmd after insert on cmd
for each row
begin
if new.success = 'no' then
# 新纪录都会被Mysql封装成NEW对象
insert into errlog(err_cmd,err_time)values(new.cmd,new.sub_time);
end end $$
delimiter ; # 结束之后记得再改回来, # 生成一个触发器 触发器名字为 tri_after_insert_cmd 这个触发器的触发条件为 after insert 当有这个动作是会触发 begin 里面的sql语句
# on cmd for each row 生效与那个表格 每一行 #往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('kevin','0755','ls -l /etc',NOW(),'yes'),
('kevin','0755','cat /etc/passwd',NOW(),'no'),
('kevin','0755','useradd xxx',NOW(),'no'),
('kevin','0755','ps aux',NOW(),'yes'); # 查看所有触发器
show triggers; # 删除触发器
drop trigger tri_after_insert_cmd;
drop trigger 触发器名称

事务

关键词:
开启事务: start transaction
节点位置: savepoint # 节点就是可以标记回滚的点
回滚: rollback
确认结束:commit 事务的四大特性(ACID) A:原子性
事务中的各项操作是不可以分割的整体,要么同时成功要么同时失败
C:一致性
使数据库从一个一致性状态变到另一个 一致性状态
I:隔离性
多个事务之间彼此不干扰
D:持久性
也称为永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的 create table user(id int primary key,name char(32),balance int); insert into user values
(1,'jason',1000),
(2,'kevin',1000),
(3,'tank',1000); start transaction
# 修改数据之前先开启事务操作 update user set balance = 500 where name = 'jason';
update user set balance = 100 where name = 'kevin'; rollback;
# 回滚,这个指令可以让数据回到事务开始之前的状态 commit;
# 事务结束 这样就不能回滚了 因为事务已经确认结束了

SQL中四种事物隔离级别

1.innoDB引擎支持所有的隔离级别
set transaction isolation level 级别
# 设置一个级别 默认为 repeatable read(可重复读) 1.read uncommitted (未提交读)
事务中的修改及时没有提交,没有确认,但是其他事务也都是可见的,事务可以读取未提交的数据,这一现象也称之为 '脏读'
事务未确认时数据其他事务读取 叫 脏读 2.read committed(提交读)
大多数数据库系统默认的隔离级别
一个事务从开始直到提交之前所做的任何修改 对其他事务都是不可见得,
这中界别叫'不可重复度'
在事务未确认前 其他事务不可以使用事务进行中的数据 3.repeatable read(可重复读) # MYSQL默认隔离级别
能够解决 '脏读' 问题,但是无法解决 '幻读' 所谓幻读指的是当某个事物在读取某个范围内的记录时 另外一个事物又在改范围内插入了新的数据,当之前的事物再次读取该范围的记录 会产生 幻读,InnoDB和XtraDB通过多版本并发控制(MVCC)及间隙锁策略解决该问题 4.serializable (可串行读)
强制事物串行执行,实际中很少使用该级别 效率很低 MVCC只能在read committed(提交读)、repeatable read(可重复读)两种隔离级别下工作,其他两个不兼容(read uncommitted:总是读取最新 serializable:所有的行都加锁) 例如:
刚插入第一条数据的时候,我们默认事务id为1,实际是这样存储的
username create_version delete_version
jason 1
可以看到,我们在content列插入了kobe这条数据,在create_version这列存储了1,1是这次插入操作的事务id。
然后我们将jason修改为jason01,实际存储是这样的
username create_version delete_version
jason 1 2
jason01 2
可以看到,update的时候,会先将之前的数据delete_version标记为当前新的事务id,也就是2,然后将新数据写入,将新数据的create_version标记为新的事务id
当我们删除数据的时候,实际存储是这样的
username create_version delete_version
jason01 2 3
"""
由此当我们查询一条记录的时候,只有满足以下两个条件的记录才会被显示出来:
1.当前事务id要大于或者等于当前行的create_version值,这表示在事务开始前这行数据已经存在了。
2.当前事务id要小于delete_version值,这表示在事务开始之后这行记录才被删除。
"""

SQL注入问题/触发器trigger/事务/事物隔离的更多相关文章

  1. pl/sql学习(5): 触发器trigger/事务和锁

    (一)触发器简单介绍 触发器是由数据库的特定时间来触发的, 特定事件主要包括以下几种类型: (1)DML: insert, update,delete 增删改 (2)DDL: create, alte ...

  2. MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制

    SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...

  3. MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制

    一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...

  4. JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务

    JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...

  5. SqlServer和Oracle中一些常用的sql语句8 触发器和事务

    --创建和执行事后触发器 --更新仓库备份表中记录时自动创建数据表且插入三条记录 create trigger db_trigger1 on 仓库备份 for update as begin if E ...

  6. python操作MySQL,SQL注入的问题,SQL语句补充,视图触发器存储过程,事务,流程控制,函数

    python操作MySQL 使用过程: 引用API模块 获取与数据库的连接 执行sql语句与存储过程 关闭数据库连接 由于能操作MySQL的模块是第三方模块,我们需要pip安装. pip3 insta ...

  7. 走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...

  8. 转:SQL进阶之变量、事务、存储过程与触发器

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 DECLARE @name varchar(20) DECLARE @id int (2)为变量赋值 SET ...

  9. MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )

    --视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...

  10. python操作MySQL、事务、SQL注入问题

    python操作MySQL python中支持操作MySQl的模块很多 其中最常见就是'pymysql' # 属于第三方模块 pip3 install pymysql # 基本使用 import py ...

随机推荐

  1. k8s中安装redis6集群

    注意:第二步不用操作了,yaml文件仅供参考 1.创建Namespace kubectl apply -f Namespace.yaml apiVersion: v1 kind: Namespace ...

  2. css文字超出后显示...

    多行 overflow: hidden; //超出的文本隐藏 text-overflow: ellipsis; //溢出用省略号显示 display: -webkit-box; -webkit-lin ...

  3. springboot自动配置原理以及手动实现配置类

    springboot自动配置原理以及手动实现配置类 1.原理 spring有一个思想是"约定大于配置". 配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot ...

  4. P1399 [NOI2013] 快餐店 方法记录

    原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...

  5. C++ 使用栈求解中缀、后缀表达式的值

    1. 前言 表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算. 但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则,这个过程中栈起到了至关重 ...

  6. 部署 LNMP(源码安装版本)shell脚本

    #!/bin/bash # 一键部署 LNMP(源码安装版本) menu() { clear echo " ##############‐‐‐‐Menu‐‐‐‐##############& ...

  7. python渗透测试入门——取代netcat

    1.代码及代码讲解. 实验环境:windows10下的linux子系统+kali虚拟机 import argparse import socket import shlex import subpro ...

  8. 我的 React 最佳实践

    There are a thousand Hamlets in a thousand people's eyes. ----- 威廉·莎士比亚 免责声明:以下充满个人观点,辩证学习 React 目前开 ...

  9. ARM TrustZone白皮书部分阅读

    嵌入式系统安全的一些解决方法及缺陷 外部硬件安全模块:在主SoC之外包含一个专用的硬件安全模块或可信元件,e.g. 手机的SIM卡.隔离仅限于可以从非易失性存储器运行的相对静态程序 内部硬件安全模块: ...

  10. 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

    前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...