請問這個PHP下防範MySQL注入攻擊的方法管用嗎?
來源:互聯網
上載者:User
關鍵字
input
replace
function
strinput
ireplace
function strinput($input)
{
$input=strval($input);
$replace=array('union','load','and','or','select','update','insert','delete','create','char','ascII','ord','conv','=','--','#','*','%','_','\\','\'',"\"");
$input=str_ireplace($replace,"0",$input);
return $input;
}
定義一個這樣的過濾函數,對所有GPC來的字串資料都先過一遍。這樣可以完全防範MySQL注入攻擊嗎?
回複內容:
這類的過濾只能給注入者增加一些麻煩,遠遠做不到完全防範。
1、注入者可以用sElEcT來代替select
2、注入者可以用sel
selectect來讓你過濾一遍,嘗試獲得select
3、注入者可以用url碼來替代所有輸入
4、注入者可以。。。用很多種方法,試出你的過濾函數是什麼樣的
你和注入者的技能可以在遭受泄露的拉鋸戰中不斷獲得提升。
直到你使用了以下方法的其中之一,才開始踏上了安全的征程:
1、白名單。嚴格定義只能輸入哪些字元來查詢,其他一律不行。
2、參數化查詢。先將SQL語言編譯,再代入參數。這時候就算他提交了select * from password where table=admin也只會去查詢這一長串字元而不會執行SQL語句了。php下的樣本如李世光所說。這個函數做到完全防範MySQL注入攻擊還是比較難的,攻與防本來就是動態,要是實現一勞永逸的防守還是有難度的。
1、針對一些安全防禦,可能目前沒法繞過,但是隨著對攻擊技術的研究可能就會出現繞過方法,像dedecms、dz等的安全防禦經常被bypass。
2、根據你業務的不同,實現業務的代碼可能就提供了繞過方法。例如一個簡單的搜尋業務,可能在後面的代碼會調用urldecode解碼函數:
.....
$q = strinput($_GET['query']);
$q = urldecode($q);
$sql = "select * from table where key='".$q."'";
.....
你在urldecode前面做的所有過濾都是徒勞的
要做到盡量減少安全性漏洞不只是sql注入,需要在恰當的地方做正確的事情。這可能要瞭解一些安全知識,像《白帽子講web安全》,《web前端駭客》都是web安全不錯的書籍。
php安全的線上文檔(e文):Survive The Deep End: PHP Security
關於mysql防護其實很簡單。
1.使用PDO::prepare PDO::bindParam來過濾輸入參數
2.將HTML轉成實體 htmlspecialchars用PHP的PDO擴充去使用資料庫,該擴充封裝的類和方法已經考慮了防注入。用PHP的安全函數在query的時候把變數轉義一下就可以了。建議使用參數化查詢或白名單。
黑名單幾乎在任何時候都是不可取的。請使用pdo不要自作聰明地過濾,總會有遺漏的地方的,你過濾不完的。
請用pdo + 參數綁定,一勞永逸,一了百了。你要注意到,這樣子很有可能過濾使用者的合法輸入。
過濾sql注入的方法常見的有如下兩種:
1 mysql_real_escape_string
2 pdo的prepare+bind
另,網站安全性不止是sql注入一方面,還要考慮到csrf和xss等。字串過濾:
1>mysql_real_escape_string
2>PDO::prepare