先前看了一本 Ajax與Google Map API入門實作,裡面就有提到一些防止 SQL Injection & XSS 攻擊應注意的事項。還來不及記錄下來就將書還回去了,今晚從 Gea-Suan Lin 這又看到應注意的事項,我也來記錄一下好了,並附上我的註記。( 下面有些專有名詞小弟就不另做解釋了,請自查 Google )
1. PHP.ini 內的 Global register 務必設成 off
老生常談了,看一下 Darkhero 的說明吧。這個問題也是最常在 PHP 相關討論區被提出來的,都是 Global register 惹的禍丫!
2.防止 SQL Injection 攻擊
在經過 mysql_query 之前,先對傳進來的變數做 mysql_escape_string 處理。之前我做了一件蠢事,一直用錯用法。錯誤的用法如下:( Orz )
$sql = "select * from table where id = '$_POST[form_id]'";
mysql_escape_string($sql);
mysql_query($sql);
後來一直發生錯誤訊息,直到參考別人範例後才知道正確的用法如下:
$_POST["form_id"] = mysql_escape_string($_POST["form_id"]);
$sql = "select * from table where id = '$_POST[form_id]'";
mysql_query($sql);
附上一個說明 SQL Injection 的範例
3.防止 XSS 攻擊
XSS 也是一種可怕的攻擊方式,在 PHP 中可以利用 htmlentities 或 htmlspecialchars 把 INPUT 類的字串包起來處理!避免東西被人家看光光。 ( htmlentities 和 htmlspecialchars 的差別是在中文處理上,前者處理中文後會變成一堆亂碼就是了 )
4.善用 urlencode 來將 URL 的值編碼
引用一下 php 手冊內的說明:URL 由幾部分組成。如果你希望自己的資料被當作其中一項來解釋,則必須用 urlencode() 對其編碼
5.呼叫外部程式時記得用 escapeshellarg 函式來過濾
這情況是在 PTT 的 PHP 板看到的,有個好心人 ( 或有心人 ?? ) 分享了一個程式,讓大家去呼叫後可以處理並顯示目前的 ISP 為何。看起來還不賴,不過還是被 DarkKiller ( 也就是 Gea-Suan Lin ) 直接指出,若在程式內加入一行程式 system("rm -rf"); 那不就毀了 ?? 因此利用 escapershellarg 函式來過濾一下也是個不錯的方法。
6.避免使用常見的變數來命名
相信一些常見的變數,如 user 、 password 等字串都是最常見的命名規則,若試著改變其命名習慣,也能大幅降低被攻擊的可能性!
先記錄到這邊,以後若有想到再來update ~
- Aug 31 Fri 2007 22:42
【PHP】設計 PHP 程式上應注意的安全顧慮
全站熱搜
留言列表