【问题标题】:Preventing Cross-Site Scripting (XSS) attack for HttpServletRequest.getHeader()防止 HttpServletRequest.getHeader() 的跨站点脚本 (XSS) 攻击
【发布时间】:2022-01-07 15:18:37
【问题描述】:

我们正在使用 java 和 spring boot。我想从HttpServletRequest 中读取一些标头值。

String header = request.getHeader("SomeHeader");

但是我们的代码质量工具是这样抱怨的:

The application's testMethod embeds untrusted data in the generated output with SomeHeader, at line 265 of src\main\java\com\test\poc\controller\Test.java. This untrusted data is embedded straight into the output without proper sanitization or encoding, enabling an attacker to inject malicious code into the output.

The attacker would be able to alter the returned web page by simply providing modified data in the user input getHeader, which is read by the getCorrelationId method at line 265 of src\main\java\com\test\poc\controller\Test.java. This input then flows through the code straight to the output web page, without sanitization. 

This can enable a Reflected Cross-Site Scripting (XSS) attack.

我已经使用 owasp 编码器依赖项搜索并尝试了以下代码,但仍然存在相同的问题。

String header = Encode.forJava(request.getHeader("SomeHeader"));

我的方法如下所示:

private String testMethod(HttpServletRequest request) {
  String header = Encode.forJava(request.getHeader("SomeHeader"));
  return header;

}

我将在另一个方法中调用上述方法,并想验证它是否为空

private void anotherMethod() {
      String header = testMethod();
      if (header != null) {
        //do something
      } else {
        //do something
      }
    }

谁能指导一下如何解决这个问题?

【问题讨论】:

    标签: java security xss


    【解决方案1】:

    编码是在输出而不是输入上完成的,所以应该在输出值的地方完成。

    要使用的编码器取决于输出格式。如果您正在生成 HTML,那么您可以使用 Encode.forHtml

    【讨论】:

    • 感谢您的回复。我已经更新了问题以更清楚地说明。请指导我在 ~testMethod()~ 或 ~anotherMethod()~ 中在哪里应用编码逻辑?
    • @Ashok.N 标头是否在任何地方写入 HTML? //do something 是对标头做些什么还是在其他地方使用它?
    • 另外,如果你知道标题的格式不应该包含除 a-z 和空格以外的字符,如果它在 testMethod 中无效,你可以完全拒绝它:if(!header.matches("[a-zA-Z ]*")) throw new RuntimeException("Invalid header: " + header);
    • 谢谢!标头未在任何地方写入 HTML。我的意图很简单。我必须从请求对象中提取特定标头的值(根据问题说“SomeHeader”的值),看看它是空的还是空的。如果是这样,只需添加记录器信息,说明“SomeHeader”的标头值为空。如果它不为空,则使用此标头值进一步填充“HTTPHeaders”对象以达到某个端点。但是我的代码质量工具在从请求对象中提取标头信息时遇到了一些问题,如帖子中所述。
    • @Ashok.N 您可以添加额外的验证以在处理之前检查标题是否符合您期望的格式。否则它应该没问题。
    最近更新 更多