重构此代码以避免在标头中放置受污染的、用户控制的数据



我正在尝试在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. 我不确定使用一些正则表达式进行检查是否能彻底解决我的问题

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

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

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

对Java字符串进行编码。这种方法将使用";\b"\t〃"\r";,"\f"\n〃"quot&"'&"&";,八进制和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));
}
}

问题是因为您在代码中使用头名称("SampleHeader"(来做出逻辑决策。

用户提供的数据,如URL参数、POST数据有效载荷或cookie,应始终被视为不可信和受污染的数据。记录受污染数据的应用程序可能会使攻击者注入破坏日志文件模式的字符。这可用于阻止监视器和SIEM(安全信息和事件管理(系统检测其他恶意事件。

在这种情况下,如果我想欺骗你的程序在headers列表中添加一个新的头,我只需要发送一个卷曲,如下所示:

curl -X GET http://localhost/your/path --header 'SampleHeader: someValue'  

这个问题可以通过在记录之前对用户提供的数据进行清理来缓解

SonarQube试图告诉您的是,您正在将您的逻辑暴露给来自客户端的输入。更好的解决方案是重构代码,使其不依赖于客户端的特定标头来执行某些操作。很难在不了解更多代码库的情况下建议示例代码。

希望这能有所帮助!

相关内容

  • 没有找到相关文章

最新更新