gpt4 book ai didi

c# - 使用 .NET Framework 下载文件时降低服务器端请求伪造的风险

转载 作者:行者123 更新时间:2023-12-04 03:44:58 27 4
gpt4 key购买 nike

问题:如果我有一个不受信任的、用户提供的文件 URL,当我下载该文件时如何保护自己免受服务器端请求伪造? .NET Framework (4.8) 基类库中是否有工具可以帮助我,或者是否有一些针对此用例的规范引用实现?

详情:我们的网络应用程序(在线产品数据库)允许用户上传产品图片。我们要求应允许用户提供(自托管)图像的 URL,而不是上传图像。
到现在为止还挺好。但是,有时我们的 Web 应用程序必须从(外部、用户提供的)URL 中获取图像才能对其进行处理(例如,将图像包含在 PDF 产品数据表中)。
这会使我的 Web 应用程序面临 Server-Side Request Forgery 的风险。 . OWASP Cheat Sheet将此用例记录为“案例 2”,并提出了一些缓解措施,例如验证 URL 和将已知内部 IP 地址列入备用列表。
这意味着我无法使用内置方法下载文件,例如 WebClientHttpWebRequest ,因为这些类负责 DNS 解析,我需要在 DNS 解析之后但在执行 HTTP 请求之前验证 IP 地址。我可以自己执行 DNS 解析,然后使用(经过验证的)IP 地址和自定义 Host header 创建一个 Web 请求,但这可能会弄乱 TLS 证书检查。
长话短说,我觉得我在这里重新发明了轮子,因为这听起来像是一个足够常见的用例。 (我肯定不是第一个必须从用户提供的 URL 获取文件的 Web 开发人员。).NET Framework 有 tools for protection against CSRF built-in ,所以我想知道是否有类似的工具可用于 SSRF,而我只是还没有找到。

注意:this one 中有类似的问题(如 )标签,但是,与他们相反,我的目标不是“摆脱警告”,而是真正保护我的系统免受 SSRF 的影响。

最佳答案

  • 与业务利益相关者确认需求。他们很可能并不关心文件是如何获得的——他们只是希望用户能够指定一个 URL 而不是本地文件。如果是这种情况,您的应用程序可以使用 Javascript 来 download the file from the browser then upload it from there .这完全避免了服务器端的问题。
  • 如果您必须在服务器端进行,请询问专用服务器的预算。在 DMZ 中找到它(在外围防火墙和将 Web 服务器与网络其余部分隔离的防火墙之间)。使用此服务器运行一个程序,该程序下载 URL 并将数据放在主应用程序可以获取的位置,例如一个数据库。
  • 如果您必须在现有硬件上托管它,请使用专用进程,在具有专用用户身份的专用应用程序池中运行。此服务的正确位置是在您的 Web 服务器(而不是应用程序或数据库服务器)上。
  • 审核和监控专用用户的安全日志。
  • 撤销对私钥或本地资源(如文件系统)的任何权限。
  • 验证协议(protocol)(仅限 http 或 https)。
  • 尽可能验证 IP 地址,并维护黑名单。
  • 验证域名以确保它是公共(public) URL,而不是您网络中的内容。如果可能,请使用具有公共(public) DNS 的代理服务器。
  • 关于c# - 使用 .NET Framework 下载文件时降低服务器端请求伪造的风险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65327459/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com