您好,欢迎来到 - 67学习网 - http://www.67xuexi.com !

防御XSS的七条原则

摘要:特别需要注意的是,在XSS防御中,有些JavaScript函数是极度危险的,就算对不可信数据进行JavaScript编码,也依然会产生XSS漏洞,例如:<script>window.setInterval(‘…就算对不可信数据进行了JavaScript编码,这里依然会有XSS漏洞…’);</script>[编码规则]除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 xHH (以 x 开头,HH则是指该字符对应的十六进制数字)在对不可信数据做编码的时候,千万不能图方便使用反斜杠( )对特殊字符进行简单转义,比如将双引号 ” 转义成 ” ,这样做是不可靠的,因为浏览器在对页面做解析的时候,会先进行HTML解析,然后才是JavaScript解析,所以双引号很可能会被当做HTML字符进行HTML解析,这时双引号就可以突破代码的值部分,使得攻击者可以继续进行XSS攻击。例如:假设代码片段如下:<script>v
防御XSS的七条原则,标签:电脑安全教程大全,http://www.67xuexi.com
  特别需要注意的是,在XSS防御中,有些JavaScript函数是极度危险的,就算对不可信数据进行JavaScript编码,也依然会产生XSS漏洞,例如:

  <script>

  window.setInterval(‘…就算对不可信数据进行了JavaScript编码,这里依然会有XSS漏洞…’);

  </script>

  [编码规则]

  除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 xHH (以 x 开头,HH则是指该字符对应的十六进制数字)

  在对不可信数据做编码的时候,千万不能图方便使用反斜杠( )对特殊字符进行简单转义,比如将双引号 ” 转义成 ” ,这样做是不可靠的,因为浏览器在对页面做解析的时候,会先进行HTML解析,然后才是JavaScript解析,所以双引号很可能会被当做HTML字符进行HTML解析,这时双引号就可以突破代码的值部分,使得攻击者可以继续进行XSS攻击。例如:

  假设代码片段如下:

  <script>

  var message = ” $VAR “;

  </script>

  攻击者输入的内容为:

  ”; alert(‘xss’);//

   如果只是对双引号进行简单转义,将其替换成 ” 的话,攻击者输入的内容在最终的页面上会变成:

  <script>

  var message = ” ”; alert(‘xss’);// “;

  </script>

  浏览器在解析的时候,会认为反斜杠后面的那个双引号和第一个双引号相匹配,继而认为后续的alert(‘xss’)是正常的JavaScript脚本,因此允许执行。

  可以使用ESAPI提供的函数进行JavaScript编码:

1 String encodedContent = ESAPI.encoder().encodeForJavaScript(request.getParameter(“input”)); 

  原则5:在将不可信数据插入到Style属性里时,对这些数据进行CSS编码

  当需要往Stylesheet,Style标签或者Style属性里插入不可信数据的时候,需要对这些数据进行CSS编码。传统印象里CSS不过是负责页面样式的,但是实际上它比我们想象的要强大许多,而且还可以用来进行各种攻击。因此,不要对CSS里存放不可信数据掉以轻心,应该只允许把不可信数据放入到CSS属性的值部分,并进行适当的编码。除此以外,最好不要把不可信数据放到一些复杂属性里,比如url, behavior等,只能被IE认识的Expression属性允许执行JavaScript脚本,因此也不推荐把不可信数据放到这里。

1 2 3 4 5 <style>selector { property : …插入不可信数据前,进行CSS编码…} </style>   <style>selector { property : ” …插入不可信数据前,进行CSS编码… “} </style>   <span style=” property : …插入不可信数据前,进行CSS编码… ”> … </span> 

  [编码规则]

  除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 HH (以 开头,HH则是指该字符对应的十六进制数字)

  同原则2,原则3,在对不可信数据进行编码的时候,切忌投机取巧对双引号等特殊字符进行简单转义,攻击者可以想办法绕开这类限制。

  可以使用ESAPI提供的函数进行CSS编码:

1 String encodedContent = ESAPI.encoder().encodeForCSS(request.getParameter(“input”)); 

  原则6:在将不可信数据插入到HTML URL里时,对这些数据进行URL编码

  当需要往HTML页面中的URL里插入不可信数据的时候,需要对其进行URL编码,如下:

1 <a href=”http://www.abcd.com?param=…插入不可信数据前,进行URL编码…”> Link Content </a>

  [编码规则]

  除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 %HH (以 % 开头,HH则是指该字符对应的十六进制数字)

 在对URL进行编码的时候,有两点是需要特别注意的:

  1) URL属性应该使用引号将值部分包围起来,否则攻击者可以很容易突破当前属性区域,插入后续攻击代码

  2) 不要对整个URL进行编码,因为不可信数据可能会被插入到href, src或者其他以URL为基础的属性里,这时需要对数据的起始部分的协议字段进行验证,否则攻击者可以改变URL的协议,例如从HTTP协议改为DATA伪协议,或者javascript伪协议。

  可以使用ESAPI提供的函数进行URL编码:

1 String encodedContent = ESAPI.encoder().encodeForURL(request.getParameter(“input”));

  ESAPI还提供了一些用于检测不可信数据的函数,在这里我们可以使用其来检测不可信数据是否真的是一个URL:

1 2 3 4 5 String userProvidedURL = request.getParameter(“userProvidedURL”);boolean isValidURL = ESAPI.validator().isValidInput(“URLContext”, userProvidedURL, “URL”, 255, false);if (isValidURL) {   <a href=”<%= encoder.encodeForHTMLAttribute(userProvidedURL) %>”></a>   } 

上一页  [1] [2] [3] [4]  下一页


Tag:电脑安全教程电脑安全教程大全电脑教程 - 电脑安全教程

《防御XSS的七条原则》相关文章