預防XSS攻擊的一些方法整理

XSS又稱CSS,全稱Cross SiteScript(跨站腳本攻擊), XSS攻擊相似於SQL注入攻擊,是Web程序中常見的漏洞,XSS屬於被動式且用於客戶端的攻擊方式,因此容易被忽略其危害性。其原理是攻擊者向有XSS漏洞的網站中輸入(傳入)惡意的HTML代碼,當用戶瀏覽該網站時,這段HTML代碼會自動執行,從而達到攻擊的目的。如,盜取用戶Cookie信息、破壞頁面結構、重定向到其它網站等。php

常見的惡意字符XSS輸入:

1. XSS 輸入一般包含 JavaScript 腳本,如彈出惡意警告框:<script>alert("XSS");</script>html

2. XSS 輸入也多是 HTML 代碼段,譬如:mysql

(1) 網頁不停地刷新 <meta http-equiv="refresh" content="0;">正則表達式

(2) 嵌入其它網站的連接 <iframe src=http://xxxx width=250 height=250></iframe>sql

防止XSS攻擊測試路徑:

測試XSS攻擊的工具:

對於PHP開發者來講,如何去防範XSS攻擊呢?

對網站發動XSS攻擊的方式有不少種,僅僅使用php的一些內置過濾函數是對付不了的,即便你將filter_var(),mysql_real_escape_string(),htmlentities(),htmlspecialchars(),strip_tags()這些函數都使用上了也不必定能保證絕對的安全。安全

那麼如何預防 XSS 注入?主要仍是須要在用戶數據過濾方面得考慮周全,在這裏不徹底總結下幾個 Tipsxss

  1. 假定全部的用戶輸入數據都是「邪惡」的
  2. 弱類型的腳本語言必須保證類型和指望的一致
  3. 考慮周全的正則表達式
  4. strip_tags()、htmlspecialchars() 這類函數很好用
  5. 外部的 Javascript 不必定就是可靠的
  6. 引號過濾必需要重點注意
  7. 除去沒必要要的 HTML 註釋
  8. Exploer 求你放過我吧……

方法一:利用php htmlentities()函數函數

php防止XSS跨站腳本攻擊的方法:是針對非法的HTML代碼包括單雙引號等,使用htmlspecialchars()函數。工具

在使用htmlspecialchars()函數的時候注意第二個參數, 直接用htmlspecialchars($string)的話,第二個參數默認是ENT_COMPAT,函數默認只是轉化雙引號("),不對單引號(')作轉義。測試

因此,htmlspecialchars()函數更多的時候要加上第二個參數,應該這樣用: htmlspecialchars($string,ENT_QUOTES)。固然,若是須要不轉化如何的引號,用htmlspecialchars($string,ENT_NOQUOTES)。

另外,儘可能少用htmlentities(), 在所有英文的時候htmlentities()和htmlspecialchars()沒有區別,均可以達到目的。可是,中文狀況下, htmlentities()卻會轉化全部的html代碼,連同裏面的它沒法識別的中文字符也給轉化了。

htmlentities()和htmlspecialchars()這兩個函數對單引號(')之類的字符串支持很差,都不能轉化, 因此用htmlentities()和htmlspecialchars()轉化的字符串只能防止XSS攻擊,不能防止SQL注入攻擊。

全部有打印的語句如echo,print等,在打印前都要使用htmlentities()進行過濾,這樣能夠防止XSS,注意中文要寫出htmlentities($name,ENT_NOQUOTES,GB2312)。

方法二:自定義過濾XSS攻擊的函數

/**
 * 防止XXS攻擊
 * @param $string
 * @param $low 安全別級低
 */
function clean_xss(&$string, $low = false) {
    if (!is_array($string)) {
        $string = trim($string);
        $string = strip_tags($string);
        $string = htmlspecialchars($string);
        if ($low) {
            return true;
        }
        $string = str_replace(array('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $string);
        $no = '/%0[0-8bcef]/';
        $string = preg_replace($no, '', $string);
        $no = '/%1[0-9a-f]/';
        $string = preg_replace($no, '', $string);
        $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';
        $string = preg_replace($no, '', $string);
        return true;
    }
    $keys = array_keys($string);
    foreach ($keys as $key) {
        clean_xss($string[$key]);
    }
}

$str = 'phpddt.com<meta http-equiv="refresh" content="0;">';
clean_xss($str); // 若是你把這個註釋掉,你就知道xss攻擊的厲害了
echo $str;

本文借鑑於:https://www.ibm.com/developerworks/cn/opensource/os-cn-php-xss/

相關文章
相關標籤/搜索