SQL Injection注入漏洞的防范:
1、對輸入進行嚴格的轉(zhuǎn)義和過濾
2、使用參數(shù)化(Parameterized Query 或 Parameterized Statement)
--推薦的做法
3、使用存儲過程
1、PHP防范案例
轉(zhuǎn)義舉例:
```
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里面的數(shù)據(jù)里面含有%的替換成空
```
推薦的做法:使用參數(shù)化(先解析語法,而不是直接將參數(shù)拼接到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);//先不傳參數(shù),先解析語法
// var_dump($stmt);
$stmt->execute(array($username,$password));
//這個時候在把參數(shù)傳進去,以索引數(shù)組的方式傳進去,就成功防止了注入
}catch (PDOException $e){
echo $e->getMessage();
}
?>
```
2、python防范案例
不安全的寫法: 直接將變量拼到SQL,產(chǎn)生注入
```
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、使用存儲過程
使用存儲過程的效果和參數(shù)化查詢語句類似,其區(qū)別就是存儲過程需要先將SQL語句定義在數(shù)據(jù)庫中。但需要注意的是,存儲過程中也可能會存在注入問題。因此應(yīng)該避免在存儲過程內(nèi)使用動態(tài)的SQL語句。