首页 > 解决方案 > 重构此代码以不在标头中放置受污染的用户控制数据

问题描述

我正在尝试在我的 HTTPHeader 中添加自定义标头,如下所示

Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
    String headerName = headerNames.nextElement();
    if (headerName.equalsIgnoreCase("SampleHeader"){
        headers.add(headerName, request.getHeader(headerName));
    }
}

但我在运行声纳时遇到了错误。

“重构此代码,不要将受污染的、用户控制的数据放在标题中。”

我认为添加正则表达式可能会解决我的问题,但我有两个问题。

  1. 我需要编写一个允许字母、数字和 . , ! - _ 但我无法创建一个。
  2. 我不确定使用一些正则表达式检查是否会解决我的问题。

标签: javaregexsecurityheadersonarqube

解决方案


您可以使用OWASP Encoder对用户输入进行编码:

<dependency>
    <groupId>org.owasp.encoder</groupId>
    <artifactId>encoder</artifactId>
    <version>1.2.3</version>
</dependency>

为用户输入添加Encode.forJava(userInput),这将:

为 Java 字符串编码。此方法将使用 "\b"、"\t"、"\r"、"\f"、"\n"、"""、"'"、"\"、八进制和 unicode 转义。有效的代理配对是不勾选。调用者必须提供封闭的引号字符。此方法在编写代码生成器和输出调试消息时很有用。

所以在你的情况下,它可能是:

Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
    String headerName = Encode.forJava(headerNames.nextElement());
    if (headerName.equalsIgnoreCase("SampleHeader"){
        headers.add(headerName, request.getHeader(headerName));
    }
}

推荐阅读