You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Checkmarx检测request.getHeader()持续触发SSRF错误,修改代码仍未解决

解决Checkmarx对request.getHeader()的SSRF检测不通过问题

问题根源

你的代码核心问题是直接使用用户可控的输入(从request.getHeader()获取的内容)动态获取或设置请求头,Checkmarx认为这种操作存在被利用发起恶意请求的风险,因此触发SSRF告警。之前的方案无效原因如下:

  1. 第一个方案正则逻辑完全倒置:你在拒绝符合复杂规则的header名称,反而允许不符合规则的输入,且正则存在语法错误(Java字符串中\d需转义为\\d),黑名单式校验本身也不被Checkmarx认可。
  2. 第二个方案若name是用户可控变量,或nameHeaderList定义不严谨(如包含风险header、未做严格校验),依然会被判定为存在风险。

有效修复方案

采用严格的白名单机制,只允许预先定义的合法header名称被处理,完全避免用户输入控制请求头的逻辑:

步骤1:定义白名单

预先定义业务所需的合法header名称集合:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

private static final Set<String> ALLOWED_HEADERS = new HashSet<>(Arrays.asList(
    "X-Valid-Name", 
    "X-User-Identifier", 
    "X-Request-Trace-Id" // 替换为你实际需要的header名称
));

步骤2:安全处理逻辑

// 获取用户传入的header名称(假设从"name"请求头传入)
String inputHeaderName = request.getHeader("name");

// 校验1:输入不为空且在白名单内
if (inputHeaderName == null || !ALLOWED_HEADERS.contains(inputHeaderName.trim())) {
    LOG.error("无效的header名称");
    throw new IllegalArgumentException("Invalid header name");
}

// 获取对应header的值
String headerValue = request.getHeader(inputHeaderName);

// 校验2:对header值做额外安全校验(可选但推荐)
if (headerValue != null) {
    // 限制值长度,避免注入
    if (headerValue.length() > 100) {
        LOG.error("header值长度超出限制");
        throw new IllegalArgumentException("Header value exceeds maximum length");
    }
    // 安全设置header
    headers.set(inputHeaderName, headerValue);
}

额外注意事项

  • 永远优先使用白名单而非黑名单,黑名单无法覆盖所有恶意输入场景。
  • 禁止让用户控制请求头的名称,所有允许的header必须由开发者预先定义。
  • 若后续将该header用于发起外部HTTP请求,需确保请求目标是可信的内部服务或已验证的外部地址,避免被利用跳转至恶意站点。

内容的提问来源于stack exchange,提问作者Swathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:20:16