請問這個PHP下防範MySQL注入攻擊的方法管用嗎?

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、注入者可以用selselectect來讓你過濾一遍,嘗試獲得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


謝邀

將$_input里的所有$_replace替換為0即繞過


關於mysql防護其實很簡單。

1.使用PDO::prepare PDO::bindParam來過濾輸入參數

2.將HTML轉成實體 htmlspecialchars


用PHP的PDO擴展去使用資料庫,該擴展封裝的類和方法已經考慮了防注入。


字元串過濾:

1&>mysql_real_escape_string

2&>PDO::prepare


用PHP的安全函數在query的時候把變數轉義一下就可以了。


不要自作聰明地過濾,總會有遺漏的地方的,你過濾不完的。

請用pdo + 參數綁定,一勞永逸,一了百了。


你要注意到,這樣子很有可能過濾用戶的合法輸入。

過濾sql注入的方法常見的有如下兩種:

1 mysql_real_escape_string

2 pdo的prepare+bind

另,網站安全性不止是sql注入一方面,還要考慮到csrf和xss等。


必須pdo啊


原則上防止sql注入,做到兩點過濾輸入,轉義輸出。當然這個比較抽象,採用pdo,並禁止pdo本地模擬。那麼就可以做到真正的放注入


啊…給你看個我寫好的吧

https://github.com/VeroFess/SafeSql

理論上沒有注入的危險了


PDO +1 或者 mysqli也可以


請使用pdo


建議使用參數化查詢或白名單。

黑名單幾乎在任何時候都是不可取的。


推薦閱讀:

mysql pid文件是什麼用途?
Mysql佔用CPU過高如何優化?
為什麼 PostgreSQL 沒有 MySQL 流行呢?
mysql如何實現四大隔離級別的?
MySQL中inner join 和 cross join 的區別?

TAG:PHP | MySQL | 黑客Hacker | PHP開發 | SQL注入 |