问题:如果我有一个不受信任的、用户提供的文件 URL,当我下载该文件时如何保护自己免受服务器端请求伪造?.NET Framework (4.8) 基类库中是否有工具可以帮助我,或者是否有一些针对此用例的规范参考实现?
详细信息:我们的网络应用程序(在线产品数据库)允许用户上传产品图片。我们要求应允许用户提供(自托管)图像的 URL,而不是上传图像。
到目前为止,一切都很好。但是,有时我们的 Web 应用程序必须从(外部、用户提供的)URL 中获取图像才能对其进行处理(例如,将图像包含在 PDF 产品数据表中)。
这使我的 Web 应用程序面临Server-Side Request Forgery的风险。OWASP 备忘单将此用例记录为“案例 2”,并提出了一些缓解措施,例如验证 URL 和将已知的内部 IP 地址列入备份列表。
这意味着我不能使用内置方法来下载文件,例如WebClient
or HttpWebRequest
,因为这些类负责 DNS 解析,并且我需要在 DNS 解析之后但在执行 HTTP 请求之前验证 IP 地址。我可以自己执行 DNS 解析,然后使用(经过验证的)IP 地址和自定义 Host 标头创建一个 Web 请求,但这可能会弄乱 TLS 证书检查。
长话短说,我觉得我在这里重新发明了轮子,因为这听起来像是一个足够常见的用例。(我肯定不是第一个必须从用户提供的 URL 获取文件的 Web 开发人员。) .NET Framework 具有防止内置 CSRF 的工具,所以我想知道我是否有类似的工具可用于 SSRF只是还没找到。
注意:在ssrf标签中有类似的问题(例如这个),但是,与它们相反,我的目标不是“摆脱警告”,而是真正保护我的系统免受 SSRF。