SQL Inject注入漏洞的防范(以摘录为主)
SQL Inject注入漏洞的防范可分为两部分:代码层面和网络层面。
代码层面:1.对输入进行严格的转义和过滤。2.使用预处理和参数化
网络层面:1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)
2.云端防护(360网站卫士,阿里云盾等)
PHP防范转义+过滤:以php为例,可以写一个函数对前端输入进来的数据进行转义,将里面的特殊符号用mysql提供的方法进行转义例如转义:mysqli_real_escape_string($link, $data);
过滤:str_replace("%"," “, $_POST[‘username’]),把post里面的数据里面含有%的替换成空.
由于采用数据库的黑名单的形式进行转移过滤,由于代码升级较快,转义和过滤会有所疏忽,所以在sql注入防护不推荐使用。
推荐使用预处理和参数化的方法,以php为例有PDO预处理的方法,可以通过它提供的方法去操作数据库。
$username= $_GET[‘username’];
$password= $_GET[‘password’];
try{
$pdo=new PDO(‘mysql:host=localhost;dbname=ant’, ‘root’,‘root’);
$sql=“select* from admin where username=? and passowrd=?”;
$stmt= $pdo->prepare( $sql);//先不传参数,先预处理
// var_dump( $stmt);
$stmt−>execute(array( $username, $password));
//这个时候在把参数传进去, 以索引数组的方式传进去, 而不是拼接, 就成功防止了注入
}catch (PDOException $e){
echo $e->getMessage();
}
?>
sql注入漏洞的产生是因为前端传进来的数据被拼接到了后台的数据库中,在PDO中写sql的时候不会将参数传进去,而是用占位符去写这个参数,然后在跟数据库交互的时候会先用占位符代替的语句去和数据库去交互,然后进行一个预处理,将sql进行编译和执行,这个时候再把参数传进去。
这是推荐的做法。
在网络防护层面:在web应用服务器前部署WAF设备:topo 防火墙会将恶意代码识别出并阻断。
为保证安全需要同时推进预处理的部署和防火墙的建设。<