SQL注入问题/触发器trigger/事务/事物隔离
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/事务/事物隔离的更多相关文章
- pl/sql学习(5): 触发器trigger/事务和锁
(一)触发器简单介绍 触发器是由数据库的特定时间来触发的, 特定事件主要包括以下几种类型: (1)DML: insert, update,delete 增删改 (2)DDL: create, alte ...
- MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制
SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...
- MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制
一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...
- JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务
JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...
- SqlServer和Oracle中一些常用的sql语句8 触发器和事务
--创建和执行事后触发器 --更新仓库备份表中记录时自动创建数据表且插入三条记录 create trigger db_trigger1 on 仓库备份 for update as begin if E ...
- python操作MySQL,SQL注入的问题,SQL语句补充,视图触发器存储过程,事务,流程控制,函数
python操作MySQL 使用过程: 引用API模块 获取与数据库的连接 执行sql语句与存储过程 关闭数据库连接 由于能操作MySQL的模块是第三方模块,我们需要pip安装. pip3 insta ...
- 走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器
一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...
- 转:SQL进阶之变量、事务、存储过程与触发器
一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 DECLARE @name varchar(20) DECLARE @id int (2)为变量赋值 SET ...
- MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )
--视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...
- python操作MySQL、事务、SQL注入问题
python操作MySQL python中支持操作MySQl的模块很多 其中最常见就是'pymysql' # 属于第三方模块 pip3 install pymysql # 基本使用 import py ...
随机推荐
- Shell分析日志文件
文章转载自:https://mp.weixin.qq.com/s/o63aIM2p9rc2OjhxiC6wgA 1.查看有多少个IP访问: awk '{print $1}' log_file|sort ...
- logstash处理字段样例
- Logstash:input plugin 介绍
- Beats:使用Elastic Stack对Nginx Web服务器监控
- Elasticsearch:Elasticsearch SQL介绍及实例 (一)
转载自:https://blog.csdn.net/UbuntuTouch/article/details/105658911
- 使用docker-compose部署SonarQube
sonarqube 安装 1.系统配置,避免启动问题 # 系统配置,避免启动问题 echo "vm.max_map_count=262144" >> /etc/sysc ...
- .Net 7内容汇总(3)--反射优化
反射这玩意,一直以来都是慢的代名词.一说XXX系统大量的反射,好多人第一印象就是会慢. 但是呢,我们又不得不使用反射来做一些事情,毕竟这玩意可以说啥都能干了对吧. It's immensely pow ...
- python-D3-语法入门1
Python语法注释 什么是注释 注释其实就是对一段代码的解释说明(注释是代码之母) 如何编写注释 方式1:解释说明文字前加警号 (pycharm中有快捷键ctrl+?) # 注释(单行注释) 方式2 ...
- 【Chrome浏览器】关闭触摸板双指滑动进行前进后退的功能
痛点 Chrome浏览器使用过程中,当前页面经常会莫名其妙地退回到上一个浏览的页面. 当时真是一脸懵B(心里一万头草泥马呼啸而过~)!以为活见鬼了! 后来才发现浏览器左边,有一个幽灵般的淡蓝色箭头的出 ...
- 2021年9月28日,老是遇到一些非常奇葩的问题。就离谱、好好的一个web项目就莫名奇妙坏了。
起因是这样的:我前几天用idea2020编辑器,用ssm框架搭建了一个图书管理系统.只是将图书信息的增删改查实现,还有用户的注册和登录功能实现.本来想着今天将用户信息的删除和修改完善以下,本来是很简单 ...