跨站点脚本:差的验证(输入验证和表示,数据流)

时间:2016-02-12 05:41:57

标签: java struts fortify esapi

我已在HP fortify门户中扫描我的应用程序并遇到问题跨站点脚本:差的验证(输入验证和表示,数据流)。

我已经在使用ESAPI库了。

我该怎么做才能解决这个问题。是否有任何其他库/ jar来验证输入。

提前致谢。

3 个答案:

答案 0 :(得分:4)

Fortify“跨站点脚本:差评验”抱怨您的OUTPUT编码不正确或无效。输出编码(转义)的目的是将特殊字符(元字符)限制为文字字符串,因此它们不能作为命令执行。

要修复,请执行以下操作:

步骤#1。确定谁将使用此“编码上下文”?

步骤#2。根据传输协议和下游需求正确编码上下文。例如:

  • 如果在URL的[?query]部分消耗了数据,则需要找到一个函数来包装(也就是编码,转义)18个保留字符(!*'();:@& = + $, /?#[])对HTTP协议有特殊意义(不必编码整个URL)。 (详见RFC3986 Sec 2.2
  • 如果数据被用作XML实体,则需要编码5个元字符(&<>“)(检查W3C XML Spec Sec 2.4)。但是,这并非总是如此。用作注释的数据,处理指令或CDATA部分不需要编码。

步骤#3。收集编码示例以供将来选择和使用:(抱歉,当发布为代码时,某些内容发生了变化,因此发布为图片)

  

需要考虑ESAPI库的开销,是否值得为一次修复加载30 MB jar?   enter image description here

enter image description here

  

使用轻量级org.owasp.encoder库输出编码

     

enter image description here

答案 1 :(得分:0)

当您使用编码来阻止XSS时会发生这种情况。如果你没有编码,你会得到一个关键的XSS发现。由于您正在进行编码,因此将其移至介质中。要完全阻止XSS,您可能希望在给定上下文的情况下使用正确的编码,然后确保您的输入正在验证。有些库可以提供帮助,例如Apache Struts Validator,但即使这样,Fortify也无法准确确定您的输入验证是否足够。静态分析产品无法确定变量内部的数据类型,因此检查正确的验证确实没有好办法。您要做的是验证输入,一旦您确定编码和输入验证的结果令人满意,您就可以取消查找。

在编写验证方法之后,您可以将它们存储在jar文件中,然后为Fortify编写自定义规则,以便它知道这些方法提供XSS验证。在将来的扫描中不会发生此问题。查看Fortify自定义规则指南中的数据流清理规则。

答案 2 :(得分:0)

Fortify非常了解ESAPI库所以请您告诉我您在inout和输出调用中调用的ESAPI库的哪个函数?您可以参考https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet获取必须用于XSS的各种上下文和验证,并根据您使用ESAPI函数所需的上下文。

在你的情况下,你使用的是简单的编码,这不是一个准确的解决方案,所以尽管fortify降低了严重性,但仍然是一个问题,所以请在源和接收器上使用正确的ESAPI函数。 Fortify不应该标记问题。如果你看到它然后创建一个自定义规则,如另一个答案所述。