关于xss防御:

  XSS防御主要从两个方面入手,对用户输入的过滤,对内容输出的编码。

  1.用户输入的过滤:

  对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分的XSS攻击。

  主要的思路就是将容易导致XSS攻击的边角字符替换成全角字符。< 和 > 是脚本执行和各种html标签需要的,比如 <script>,& 和 # 以及 % 在对URL编码试图绕过XSS filter时,会出现。我们说对输入的过滤分为白名单和黑名单。黑名单就是列出不能出现的对象的清单,一旦出现就进行处理。还有一种白名单的过滤,白名单就是列出可被接受的内容,比如规定所有的输入只能是“大小写的26个英文字母和10个数字,还有-和_”,所有其他的输入都是非法的,会被抛弃掉。很显然如此严格的白名单是可以100%拦截所有的XSS攻击的。但是现实情况一般是不能进行如此严格的白名单过滤的。

  对于输入,处理使用XSS filter之外,对于每一个输入,在客户端和服务器端还要进行各种验证,验证是否合法字符,长度是否合法,格式是否正确。在客户端和服务端都要进行验证,因为客户端的验证很容易被绕过。其实这种验证也分为了黑名单和白名单。黑名单的验证就是不能出现某些字符,白名单的验证就是只能出现某些字符。尽量使用白名单。

  2.对输出进行编码:

  如果输出位置在script或者事件中,应该对输出的变量采用javascriptencode来过滤JavaScript代码。

  如果输出在html的内容或者属性中,应该对输出的变量采用htmlencode来避免用户插入新的标签。

    1> 作为body文本输出,作为html标签的属性输出:

    比如:<span>${username}</span>, <p><c:out value="${username}"></c:out></p>

    <input type="text" value="${username}" />

    此时的转义规则如下:

    < 转成 &lt;

    > 转成 &gt;

    & 转成 &amp;

    " 转成 &quot;

    ' 转成 &#39

    2> javascript事件

   

<input type="button" onclick='go_to_url("${myUrl}");' />
    除了上面的那些转义之外,还要附加上下面的转义:
    \ 转成 \\
    / 转成 \/
    ; 转成 ;(全角;)

    3> URL属性

    如果 <script>, <style>, <imt> 等标签的 src 和 href 属性值为动态内容,那么要确保这些url没有执行恶意连接。

    确保:href 和 src 的值必须以 http://开头,白名单方式;不能有10进制和16进制编码字符。

  3.设置cookie的httponly属性

  除了过滤输入输出以外,我们还可以对黑客经常从xss获取的cookie信息布局,将cookie设置httponly属性,dom文档对象就不会显示此cookie内容,但是不影响正常的浏览网页。对于设置了httponly的cookie,js是无法读取到的。对于敏感重要的cookie信息,可以使用这种方法防止黑客盗取,类似的方法还可以将cookie绑定ip,这样即使黑客得到了用户的cookie也无法使用。