java - 重构此代码以不在标头中放置受污染的用户控制数据
问题描述
我正在尝试在我的 HTTPHeader 中添加自定义标头,如下所示
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
if (headerName.equalsIgnoreCase("SampleHeader"){
headers.add(headerName, request.getHeader(headerName));
}
}
但我在运行声纳时遇到了错误。
“重构此代码,不要将受污染的、用户控制的数据放在标题中。”
我认为添加正则表达式可能会解决我的问题,但我有两个问题。
- 我需要编写一个允许字母、数字和 . , ! - _ 但我无法创建一个。
- 我不确定使用一些正则表达式检查是否会解决我的问题。
解决方案
您可以使用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));
}
}
推荐阅读
- java - 如何使用 jsoup 将 div 转换为文本?
- javascript - 如何在Javascript中交换字符串变量中的两个相邻字符
- reactjs - VS Code 中过度热心的代码提示
- scala - java.lang.NoSuchMethodError 与 Scala 的 Bigquery API
- c# - “1 不是受支持的代码页”JetBrains Rider
- matplotlib - 水平收缩 matplotlib 寄生轴以占据大约 25% 的图像长度
- ios - Admob 加载屏幕后不显示插页式广告,在某些情况下仅显示一次
- reactjs - 无法实现完全的 Jest 覆盖(Jest + Enzyme + React)
- bash - bash错误,命令后缺少括号
- docker - 从在 docker 容器中运行的 Jenkins 传输构建工件时出现问题