防止直接访问 IIS 服务器上的文件

Prevent direct access to files on IIS server

我有两台服务器,一台用于我的 mvc 应用程序,另一台用于存储图像等大文件,两者都 运行 Windows Server 2012 R2。

如何防止直接访问存储服务器上的文件?

比如说,mvc 在 IP1/ 上,存储在 IP2/ 上。

Link 到一个文件就像:IP2/MediaFiles/2015/12/image0001.jpg.

我只需要 GET 来自 IP1 的请求可以访问上面的 link。怎么样?


更新

IP1 上的服务器 1 需要没有文件共享,因为媒体服务器在 IP2 上,我们不需要在服务器 1 的 RAM 上按请求加载文件。 (server1 很快就会崩溃!)因此无法使用 HttpHandler

在这个问题中,我正在寻找一种方法来防止未经授权的用户通过输入直接地址来访问服务器 2(在 IP2 上)上的文件。

你想要的都在Web.Config文件中。如果你在那里使用 IIS,你应该把它放在你的文件存储服务器的根目录中。

<system.webServer> 节点中,您应该放置此代码:

<security>
    <ipSecurity allowUnlisted="false">    <!-- this line blocks everybody, except those listed below -->                
        <clear/> <!-- removes all upstream restrictions -->
        <add ipAddress="127.0.0.1" allowed="true"/>    <!-- allow requests from the local machine -->
        <add ipAddress="IP1" allowed="true"/>   <!-- allow the specific IP of IP1  -->                             
    </ipSecurity>
</security>

根文件夹的所有子文件夹都将接受此规则。如果您只需要阻止对特定文件夹的请求,您应该将 Web.Config 放在那里。

如果您想了解有关 IIS 中 IP 黑白名单的更多信息,请查看 this article

好的,我找到了解决方案!

处理此类问题需要根据您的需要从不同来源收集一些技巧。我一直在寻找一种方法来防止未经授权的用户访问与您的主服务器不同的文件服务器上的文件。 (主服务器正在授权用户)

首先,我使用 IIS 规则阻止了所有包含敏感文件 Url 模式 的传入请求。然后我为文件服务器编写了一些代码行来使用 IHttpHandler 接口处理 Http 请求,以便 1) 检查授权规则和 2) 将确切的文件发送到客户端而不将它们转换为字节数组。最后,我使用 This Link 将 link 美化为文件服务器!这就是所有人 ;)

现在:

物理 link [阻塞] : IP2/MediaFiles/2015/12/image0001.jpg

虚拟 link : IP2/Please/Find/A/File/By/DB/Id/1 ---> image0001.jpg