如何修复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
相关产品推荐
相关产品推荐

