2013年6月2日 星期日

[PHP] SQL injection 的防範之道

這篇 利用搜尋引擎找出-github-上可以被-sql-injection-的程式 蠻有意思的,而且其實也是很多人常常會犯的毛病。應該說,SQL injection 的基本問題就在於 SQL 查詢字串容易被插入預期外的內容。如果明白這個關鍵點,那 SQL injection 的防禦就變得容易很多:

以下是幾點建議的防範之道:
這個用法其實很簡單,像這樣:
foreacho ($_GET as $name => $value) {
    $_GET[$name] = str_replace(";", "", $_GET[$name]);
    $_GET[$name] = strip_slashes($_GET[$name]);
}
就可以很簡單的處理掉 $_GET/$_POST 裡面可能會有的多重查詢的 SQL injection 或著是利用 slashes 跳脫的情況。

雖然還蠻浪費 CPU 資源的,但是這個做法不用改到系統,如果架構設計的好,也不會改動很多地方,所以是我第一個推薦的方法。
  • auto_prepend
auto_prepend 是 php 的設計,在 php.ini 裡面啟用,每個 php script 執行前都會自動插入的檔案,很適合拿來處理全域的動作,所以如果你幾乎每個 php script 都會要防範 SQL injection 的話,用這個顯然是最快改好的,不過因為是在系統處理,所以需要 root 權限,或著能使用 ini_set 的權力。
  • SQL
有些 DB 的使用是透過像 simple php mysql class 這種 class 包裝的使用,這樣的使用方式讓每個 mysql query 都是透過這個 class 。也就提供我們追加 SQL string 防堵 SQL injection 的方法。

結論:SQL injection 其實很簡單,需要做的工夫並不多,就可以達成讓 php script 安全查詢資料庫的目的,但是安全永遠都只有一線之隔而已。

沒有留言:

張貼留言