2011-01-26 79 views
0

xss.phpPHP過濾器擴展默認設置

<?php 
header('Content-Type:text/html; charset=UTF-8'); 

var_dump(ini_get('filter.default')); 

if (isset($_GET['name'])) { 
    echo $_GET['name']; 
    exit(); 
} 

瀏覽http://localhost/xss.php?name=%3Cscript%3Ealert('XSS')%3C/script%3E

輸出:

串(10) 「unsafe_raw」

我下印象由於過濾器,這對於XSS漏洞是安全的擴展名,但它不是!它輸出一個JavaScript警報對話框。我的問題是:

  • 爲什麼默認過濾器unsafe_raw。我讀過unsafe_raw不能防止XSS?
  • 如何保護PHP免受此漏洞的侵害。我可以修改我的php.ini,但我希望在運行時執行此操作,但ini_set,.htaccess在我的Ubuntu盒子上默認不工作。我想讓它在運行時受到影響,以便所有的php實例(當部署在其他機器上)都是安全的。這是可能的,還是我真的需要撒上我的代碼filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);,以確保安全。

P.S:此代碼是安全的,也沒有看壞,但如果我可以將它設置在運行時,它會更好。

<?php 
header('Content-Type:text/html; charset=UTF-8'); 

$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); 
if (isset($_GET['name'])) { 
    echo $_GET['name']; 
    exit(); 
} 

回答

2

過濾器擴展不能防止XSS輸入字符串。大多數過濾功能都是基於字符集進行有限的消毒。有些像_VALIDATE_EMAIL和_VALIDATE_URL只是根據正則表達式(主要)驗證格式。

即使w3fools說:

的FILTER_UNSAFE_RAW濾鏡不起作用,或者編碼和條指定的字符。

您需要將它與_FLAG_STRIP_ *或_FLAG_ENCODE_ *選項結合使用才能使其有用。

而對於FILTER_SANITIZE_SPECIAL_CHARS,你最好使用htmlspecialchars()。

爲什麼默認過濾器是unsafe_raw。

爲了不搞亂現有腳本的行爲,默認的過濾器設置是無意的。

如何保護PHP免受此漏洞的影響。我可以修改我的php.ini,但我想在運行,但用的ini_set做到這一點,...

寫出用htmlspecialchars()很短的包裝功能,並將其應用到所有輸出你做 - 不管輸入來自哪裏。

通過ini_set()設置默認過濾器函數是不可能的AFAIK,因爲過濾器基本上像magic_quotes一樣運行。它只在PHP啓動時在所有輸入數據中調用一次。調用ini_set對現有的輸入數組沒有影響。

+0

您應該從Rasmus => http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html閱讀此博客條目。他說他不會在代碼中使用它,但使用pecl擴展名,filter_raw_string是安全的!你不需要htmlspecialchars()了...... – Alfred 2011-01-26 21:37:28