【问题标题】:Fixing Cross site scripting vulnerability in java using OWASP使用 OWASP 修复 Java 中的跨站点脚本漏洞
【发布时间】:2023-07-23 15:05:01
【问题描述】:

我正在修复 java 中的跨站点脚本问题。由于我是 OWASP 的新手,请有人帮我弄清楚如何在以下情况下使用 OWASP 来清理输入。

  1. Enumeration<String> EnumHeader = request.getHeaderNames();

  2. Map<String, String[]> pMap = request.getParameterMap();

  3. Object value = request.getHeader(key);

  4. String[] refs = (req.getParameterValues(REFS_NAME));

【问题讨论】:

标签: java xss esapi


【解决方案1】:

虽然数据验证对于防止 XSS 非常有帮助,但它不一定涵盖持久性 XSS 的所有基础。唯一 100% 有效的保护是 OWASP Java 编码器项目或 OWASP ESAPI 的编码器提供的正确的上下文输出编码。造成这种情况的一个原因是对于持久性 XSS,受污染的数据可能来自一个数据库,该数据库可能被另一个应用程序输入或更改,该应用程序对这些相同的数据库表具有插入/更新访问权限,但没有进行正确的数据验证。 (也就是说,受污染的数据可能会以其他方式进入您的系统,而不是通过您的应用程序。)因此,唯一万无一失的解决方案是进行适当的上下文输出编码。已经向您指出的 OWASP XSS 预防备忘单是一个很好的起点,可以解释所有这些。

【讨论】:

    【解决方案2】:

    您可以使用操作系统库来清理这些字符串/对象。

    示例库:https://finn-no.github.io/xss-html-filter/

    然后,对于这些标头和参数集合,您可以使用 Java 8 Streams 遍历它们,并将它们映射到新的过滤集合(使用 sanitizer 库)。

    【讨论】:

    • 该库的方法,使用正则表达式替换 html 中的字符串,可以生成易受攻击的格式错误的 html。 owasp html sanitizer 更好。例如,这会执行一个警报:<a href='</a>'<script>alert(1)</script>'>123</a><a href='</a>'<script>alert(1)</script>'>123</a>
    • 确实,此处引用的 HTML 过滤器具有特定用例,即您的应用程序必须接受来自用户的 HTML 内容——默认情况下,它可能使您更容易受到攻击,尤其是在您不进行输出转义的情况下.正如@fgb 还指出的那样,清理 HTML 的正确方法是使用 HTML 解析器,而不是正则表达式。
    【解决方案3】:

    可以通过对参数进行编码以及使用自定义正则表达式验证参数来修复跨站点脚本。

    例如:Encode.forhtml(inputparam)

    使用 OWASP 编码器的基于上下文的编码有多种类型。如果您不确定编码器或验证模式,请尝试以下跨站点脚本验证器以确保工作(正确)修复方法。

    Java 的 XSS 验证器:http://fixforscrossite.us-east-2.elasticbeanstalk.com/

    【讨论】: