zoukankan      html  css  js  c++  java
  • 浅谈xss防御

    关于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也无法使用。

  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/zllovellyo/p/12593455.html
Copyright © 2011-2022 走看看