SQL Inject常见防范措施
代码层面:
1.对输入进行严格的转义和过滤
2.使用预处理和参数化(Parameterized)
网路层面:
1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)
2.云端防护(360网站卫士,阿里云盾等)
措施:
防范措施+过滤
以PHP为例:
SQL Inject注入漏洞的防范PHP防范转义+过滤
转义举例:
function escape( link , date){
if(is_ string(data)){
return mysq1i_real_escape_string(link, data);
if(is_array(data)){
foreach (data as key=>va1){
data[key]=escape(link, va1);
}
}
return data;
}
link 和date后都需要加$
使用函数从前端输入进来的数据进行转义,将输入的特殊符号比如说:“单引号双引号斜杠等等。”用MySQL里面的方法,像上述例题,用MySQL_real_escape_string对其转义。不为最优解。
过滤举例: ( 黑名单)
str. replace("%"",$POST’username’]),把post里面的数据里面含有%的替换成空
黑名单机制,数据库升级较快,新的内容出来了,一个新的特殊符号可能也会造成SQL注入漏洞。
SQL Inject注入漏洞的防范-PHP防范案例-PDO预处理(推荐)
SQL Inject注入漏洞的防范PHP防范案例-PDO预处理(推荐)
推荐的做法:使用PDO的prepare预处理(预处理+参数化)
$ username=
G
E
T
[
′
u
s
e
r
n
a
m
e
′
]
;
(
G
E
T
前
有
_ GET[ ' username '] ; (_GET前有
GET[′username′];(GET前有符号)
$ password= $ GET[ ’ password’];
try{
$pdo=new PDO( ’ mysql : host= localhost ; dbname=ant’, ‘root’ ,’ root’ );
$sq1=" select * from admin where username=? and passowrd=?" ;
s
t
m
t
=
stmt=
stmt=pdo->prepare ($ sql);//先不传参数,先预处理,用占位符的方式代替参数内容与数据库内容去交付,通过预处理(preaper),先把SQL的这条逻辑进行执行和编译
//
var_ dump( $stmt);
$ stmt>execute(array(
u
s
e
r
n
a
m
e
,
username,
username,password)); stml前有
//这个时候在把参数传进去,以索引数组的方式传进去,而不是拼接,就成功防止了注入
}catch (PDOException $e){
echo $e->getMessage();
}
?>
不管构造的是什么东西是payload或者由自己构造闭合的东西最终传到SQL里面的时候总会当作是一个整体,而不会去与原有的SQL语句进行拼接。
通过pdo彻底避免拼接SQL
使用WAF(Web application firewall)Web应用防火墙,攻击者通过网络去利用数据库的漏洞时,防火墙会通过web传递一些对应的payload,该防火墙会把payload识别出来,会阻断恶意payload的漏洞,将其阻断掉。
安全开发时:
在甲方安全建设过程中,同时推进两个步骤
1.推进开发人员去安全的,使用预处理,做相关的数据库操作
2.在应用程序层面部署web防火墙
通过云端防护集群
云端防护集群