SQL注入漏洞成因
-
用户能控制传参
-
SQL语句中拼接了用户传参的内容、
-
拼接后的SQL语句必须等在数据库中方执行
什么是预编译?
-
普通的SQL语句执行过程:
-
客户端对SQL语句进行占位符替换得到完整的SQL语句
-
客户端发送完整SQL语句到MySQL服务端
-
MySQL服务端执行完整的SQL语句并将结果返回给客户端
-
一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL)
-
-
预编译执行过程:
-
把SQL语句分成两部分,命令部分与数据部分
-
先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预编译
-
然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换
-
MySQL服务端执行完整的SQL语句并将结果返回给客户端
-
所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数 化,一般称这类语句叫Prepared Statements
-
预编译的好处
-
优化MySQL服务器重复执行SQL的方法,可以提升服务器性能,提前让服务器编译,一次编 译多次执行,节省后续编译的成本
-
避免SQL注入
预编译如何设置
-
定义预编译语句
-
PREPARE stmt_name FROM preparable_stmt;
-
执行预编译语句
-
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
-
删除(释放)定义
-
{DEALLOCATE | DROP} PREPARE stmt_name;
use sql_inject;
prepare select_content from 'select id,name,content,released from products where
category = ? and released = ?'; #select_content可以理解为变量名
#单引号内的为模板
set @a='Gifts' #设置两个变量
set @b=0
execute select_content using @a,@b; #在select_content变量模板中依次填入a,b的值
Q:可能有人疑惑最终运行的代码还是拼接后的sql语句,为何能避免SQL注入
A:只对模板进行了编译,用户传的参数,不会进行编译,导致参数中sql语句不会执行
-
文章图片摘自互联网,如有侵权,速删
原文始发于微信公众号(乌托邦安全团队):SQL注入的终焉
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论