請問這個PHP下防範MySQL注入攻擊的方法管用嗎?
01-13
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來代替select2、注入者可以用selselectect來讓你過濾一遍,嘗試獲得select3、注入者可以用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_string2&>PDO::prepare
用PHP的安全函數在query的時候把變數轉義一下就可以了。
不要自作聰明地過濾,總會有遺漏的地方的,你過濾不完的。請用pdo + 參數綁定,一勞永逸,一了百了。
你要注意到,這樣子很有可能過濾用戶的合法輸入。
過濾sql注入的方法常見的有如下兩種:1 mysql_real_escape_string2 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 的區別?