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

如何修复Fortify检测出的Server Side Request Forgery(SSRF)错误

Server Side Request Forgery(SSRF)修复方案

问题分析

从代码截图可见,当前代码直接使用用户可控的URL发起服务器端请求,未做任何安全校验,这会被Fortify检测出SSRF风险——攻击者可构造恶意URL,诱导服务器访问内部私有资源或第三方危险站点。

核心修复逻辑

SSRF的根源是不可信输入直接用于发起服务器请求,修复关键在于对请求目标做严格的校验与限制。

具体修复方案

1. 白名单校验(最有效方案)

  • 维护业务允许访问的域名/IP白名单,仅允许请求白名单内的地址
  • 示例代码(Java):
// 定义业务允许的域名白名单
private static final Set<String> ALLOWED_DOMAINS = new HashSet<>(Arrays.asList("trusted-service.com", "authorized-api.cn"));

public void loadResource(String userInputUrl) throws MalformedURLException {
    URL targetUrl = new URL(userInputUrl);
    String targetHost = targetUrl.getHost();
    
    // 校验目标域名是否在白名单内
    if (!ALLOWED_DOMAINS.contains(targetHost)) {
        throw new IllegalArgumentException("禁止访问未授权地址");
    }
    
    // 后续合法请求逻辑
    HttpURLConnection conn = (HttpURLConnection) targetUrl.openConnection();
    // ...
}

2. 拦截内部敏感地址

  • 过滤私有IP段(192.168.x.x、10.x.x.x、172.16.x.x-172.31.x.x)、回环地址(127.0.0.1)及本地主机名(localhost),防止攻击者访问服务器内部资源
  • 解析URL获取目标IP后,判断是否属于上述敏感范围

3. 限制请求协议

  • 仅允许使用http/https协议,禁止file/ftp/gopher等危险协议,避免攻击者读取服务器本地文件或访问特殊服务
  • 示例代码:
URL targetUrl = new URL(userInputUrl);
String protocol = targetUrl.getProtocol();
if (!"http".equals(protocol) && !"https".equals(protocol)) {
    throw new IllegalArgumentException("仅支持HTTP/HTTPS协议");
}

4. 设置请求超时

  • 配置合理的连接超时与读取超时,避免恶意请求长期占用服务器资源
  • 示例代码:
conn.setConnectTimeout(10000); // 10秒连接超时
conn.setReadTimeout(30000);    // 30秒读取超时

5. 代理中转校验

  • 所有服务器端请求通过专用代理转发,代理层统一做地址过滤、协议限制,减少业务代码的校验负担

额外注意事项

  • 必须解析URL后校验主机、协议字段,避免攻击者通过@符号、IP进制转换等特殊格式绕过校验
  • 定期更新白名单,根据业务需求调整允许访问的地址范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:31:17