一次sql注入引发的多个mysql进程锁住的问题(针对myisam)

以前碰到过一个sql注入式攻击引发大量mysql进程被锁住的例子,现在分享给大家。当时数据表用的是myisam存储引擎。

基本知识点:

InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,而MyISAM支持的是表级锁。

对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的。

模拟示例:

create table myisam_test(id int primary key not null auto_increment,

v1 varchar(64),

v2 varchar(64)) engine=myisam;

insert into myisam_test(v1,v2) values('a','b');

多次执行 insert into myisam_test(v1,v2) select concat(v1,'a'),concat(v2,'b') from myisam_test;

接下来大boss上场了,就是那段被注入的sql

select * from myisam_test where (id=1000) xor(if(453=453,sleep(5),0)) limit 1;

由于程序没有过滤非法参数值(xor(if(453=453,sleep(5),0))),sql一直在执行中,但是读操作不会阻塞其他用户对同一个表的读请求因此执行另一条select后会立刻返回执行结果:

但是假如我们在此时执行写操作呢?见下图:

读操作会阻塞对同一表的写请求,而写操作会阻塞其他用户对同一表的读和写操作,因此在这里后续的update和select语句都因为id=8的那个process而一直处于等待状态,无法返回结果。

我们kill掉那条被注入的sql执行进程,锁立刻释放,后续的sql立刻返回结果。

Sql注入式攻击再配合myisam的特性,导致大量进程处于等待状态,因此我们编程时基本的安全意识还是要有的,如净化用户输入,如使用如下参数化查询而不是将参数拼接到sql语句中:

PreparedStatement prep = conn.prepareStatement("SELECT * FROM  myisam_test WHERE v1=? AND v2=?");
prep.setString(1, value1);
prep.setString(2, value2);
prep.executeQuery();

原文发布于微信公众号 - java达人(drjava)

原文发表时间:2016-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏aoho求索

MySQL探秘(三):InnoDB的内存结构和特性

 常言说得好,每个成功男人背后都有一个为他默默付出的女人,而对于MySQL来说,这个“人”就是InnoDB存储引擎。  MySQL区别于其他数据库的最为重要的特...

3091
来自专栏杨建荣的学习笔记

浅谈MySQL中的事务隔离级别(r11笔记第86天)

之前写了一篇浅谈事务(一),算是对事务的一个基本认识,今天来简单总结一下事务的隔离级别,虽然是老掉牙的知识点,重温一下还是值得的。 在MySQL中基...

3369
来自专栏程序猿DD

Spring Cloud Config采用数据库存储配置内容

在之前的《Spring Cloud构建微服务架构:分布式配置中心》一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息...

2163
来自专栏PPV课数据科学社区

Android数据库高手秘籍(一)——SQLite命令

要想熟练地操作任何一个数据库,最最基本的要求就是要懂SQL语言,这也是每个程序员都应该掌握的技能。虽说SQL博大精深,要想精通确实很难,但最基本的一些建表命令,...

3855
来自专栏PHP在线

数据优化

数据优化 读写分离,在X2的版本中,我们引入了多SQL服务器的支持,在主从服务器中,你可以配置写服务器跟读服务器,这样对于负载高的站点中可以使用这个 功能达到读...

2918
来自专栏软件工程师成长笔记

9月17-MySQL性能优化

1093
来自专栏性能与架构

一个写SQL语句的便利工具

前言 我们平时会经常写SQL语句,这个过程我有一个痛点 我一直使用的数据库工具是 Sequel Pro,在写SQL时有点不方便,主要是对表明和字段名的自动提示支...

4538
来自专栏小L的魔法馆

MySql修改WordPress密码

4026
来自专栏运维技术迷

MySQL数据库(一):安装MySQL数据库

安装环境: 操作系统版本:RHEL 6.5 安装版本:MYSQL 5.1 升级版本:MYSQL 5.6 一、简述MYSQL 1.什么是数据库? DB ...

4398
来自专栏张狗蛋的技术之路

MySQL探秘(三):InnoDB的内存结构和特性

 常言说得好,每个成功男人背后都有一个为他默默付出的女人,而对于MySQL来说,这个“人”就是InnoDB存储引擎。  MySQL区别于其他数据库的最为重要的特...

1542

扫码关注云+社区

领取腾讯云代金券