先前看了一本 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 ~
arrow
arrow
    全站熱搜

    Bojack 發表在 痞客邦 留言(1) 人氣()