『壹』 php中防止SQL注入,該如何解決
php注入,原則上是因為sql拼接引起的。
通常避免sql注入的原則是:
類型校驗,比如int類型的欄位進行強制轉換intval。
避免字元型的sql拼接,使用unhex繞過sql解析截斷的字元處理。
舉個例子:
select * from pass where username = '$a';
這種情況,當$a="1' or 1 = 1 or '2' = '2"情況時,真個sql變成了
select * from pass where username = '1' or 1 = 1 or '2' = '2' ;
那麼這個sql就會改變sql原有語義。
類型校驗大家都會,這里就不進行說明了,下面說明下使用unhex來進行字元型欄位轉碼,繞過sql語義解析截斷避免sql注入。
使用unhex(bin2hex)後,原有邏輯變成
$a = bin2hex($a);
select * from pass where username = unhex('$a') ;
由於bin2hex,$a轉化成16進制數避免了sql注入的風險。
sql執行階段,優先執行sql語義解析,而後進行unhex('$a') 的運算,所以會把"1' or 1 = 1 or '2' = '2"整個字元串當做一個欄位執行,而不會進行解析,避免了sql注入問題~