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

WebRequest.Create引发SSRF漏洞,求适配任意互联网主机的修复方案

修复WebRequest.Create引发的SSRF漏洞(允许任意外网主机场景)

核心修复逻辑

扫描工具报SSRF并非因为你允许访问外网,而是代码未限制对内部私有IP、回环地址、保留网段的访问。即使业务需求允许访问任意互联网主机,也必须拦截指向内部网络的请求——这才是消除SSRF风险的关键。

具体修复步骤

1. 编写内部IP校验方法

先实现一个方法,判断目标IP是否属于内部/保留网段:

using System.Net;
using System.Net.Sockets;

public bool IsInternalIP(string ipAddress)
{
    IPAddress ip = IPAddress.Parse(ipAddress);
    // 拦截回环地址(127.0.0.0/8)
    if (IPAddress.IsLoopback(ip)) return true;
    // 拦截私有网段:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16
    byte[] bytes = ip.GetAddressBytes();
    switch (bytes[0])
    {
        case 10:
            return true;
        case 172:
            return bytes[1] >= 16 && bytes[1] <= 31;
        case 192:
            return bytes[1] == 168;
        // 拦截IPv6内部地址(fd00::/8、::1)
        case 0xfd:
            return true;
        default:
            return ip.Equals(IPAddress.IPv6Loopback);
    }
}

2. 创建请求前做IP校验

在调用WebRequest.Create前,先解析目标URL的IP并校验:

string targetUrl = "业务传入或指定的目标URL";
Uri uri = new Uri(targetUrl);

// 解析目标域名对应的所有IP
IPHostEntry hostEntry = Dns.GetHostEntry(uri.Host);
foreach (IPAddress ip in hostEntry.AddressList)
{
    if (IsInternalIP(ip.ToString()))
    {
        // 拦截内部IP请求,抛出异常或返回业务错误
        throw new InvalidOperationException("禁止访问内部网络地址");
    }
}

// 校验通过后再创建请求
WebRequest request = WebRequest.Create(targetUrl);

3. 额外防护:限制请求协议

只允许HTTP/HTTPS协议,避免攻击者通过ftp、file、gopher等协议发起恶意请求:

if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps)
{
    throw new InvalidOperationException("仅支持HTTP/HTTPS协议");
}

为什么直接传字符串没用?

WebRequest.Create不管传入的是Uri还是字符串,核心问题都在于没有对目标地址的IP做网段校验。扫描工具会检测是否存在未限制的内部地址访问路径,所以必须加上IP拦截逻辑才能通过检测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:57:22