SQL Injection注入漏洞的防范:
1、对输入进行严格的转义和过滤
2、使用参数化(Parameterized Query 或 Parameterized Statement)
--推荐的做法
3、使用存储过程
1、PHP防范案例
转义举例:
```
function escape($link,$data){
if(is_string($data)){
return mysqli_real_escape_string($link,$data);
}
if(is_array($data)){
foreach ($data as $key=>$val){
$data[$key]=escape($link,$val);
}
}
return $data;
}
```
过滤举例:(黑名单)
```
str_replace("%","",$_POST['username']),把post里面的数据里面含有%的替换成空
```
推荐的做法:使用参数化(先解析语法,而不是直接将参数拼接到SQL中)
```
$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();
}
?>
```
2、python防范案例
不安全的写法: 直接将变量拼到SQL,产生注入
```
import psycopg2
def bla_range_result(self,startid,endid):
range_result = “select * from result where id>=%s and id<=%s” % (startid,endid)
self.cur.execute(range_result)
self.db.commit()
```
不安全的写法: 使用psycopg2的占位符写法
```
import psycopg2
def bla_range_result(self,startid,endid):
range_result = "select * from result where id>=%s and id<=%s"
self.cur.execute(range_result,(startid,endid))
self.db.commit()
```
3、使用存储过程
使用存储过程的效果和参数化查询语句类似,其区别就是存储过程需要先将SQL语句定义在数据库中。但需要注意的是,存储过程中也可能会存在注入问题。因此应该避免在存储过程内使用动态的SQL语句。