显示客户端无权限的另一台服务器的媒体 (asp.net)

Displaying media from another server where the client has no permission (asp.net)

提问人:Spike Colman 提问时间:8/23/2023 更新时间:8/23/2023 访问量:30

问:

我的网页(asp.net)应该显示一个非常机密的媒体表,然后在单击时在新窗口中打开文件。

当我将媒体本地放置在 IIS 服务器上的文件夹上并链接到那里的文件时,它工作正常。 但是安全顾问不允许以任何方式(!他说,这意味着最终用户可以访问媒体文件夹,并且由于所有文件(所有其他用户)都在同一个文件夹中,因此他可以看到所有其他媒体。

他的解决方案是将所有媒体存储在另一个文件服务器上,客户端无法访问该服务器,网页将显示该媒体(不授予客户端对其他文件服务器的任何权限)。 因此,基本上,IIS 服务器就像客户端和媒体之间的中间人。

这带来了两个问题:

  1. 指向文件服务器媒体的直接链接(完整路径)不会显示任何内容(即使通过记事本创建一个简单的 html 页面,使用相同的链接,它确实有效)。也许 asp.net 由于某种原因不允许完整的网络路径?

  2. 我仍然需要用户在单击媒体时在新窗口中打开媒体。现在,它使用指向本地文件位置的 Href 链接。一旦文件没有存储在本地,我该怎么做?

我四处搜索,人们建议从 DNS 服务器创建一个虚拟域,以便它不是“\fileserver\shareName”,而是“www.fakedomain.com\shareName”。这似乎也行不通。

尝试显示来自其他服务器的媒体时的最佳做法是什么? 我真的希望我设法正确地解释了这种情况......

asp.net 安全 文件服务器

评论


答:

0赞 Albert D. Kallal 8/23/2023 #1

好吧,请记住,基于 Web 的 URL 通常映射到根目录中的 Web 文件夹。

但是,代码隐藏没有此类限制。

因此,只要 Web 服务器可以访问其他服务器上的文件/文件夹,那么代码隐藏就可以将文件“传输”给最终用户,并且不存在安全漏洞。此外,如果文件的数据库列表仅限于一个用户,还是基于其他一些标准?

因此,假设我有这两个文件,并且文件列表基于用户的登录:

enter image description here

所以,上面只是一个简单的列表视图(或者你可以有一个网格视图),并不重要。

但是,当您单击图像以下载该文件时?

隐藏的代码从数据库中获取信息,然后将文件“传输”给最终用户。(他们获得标准文件下载)。

请记住,隐藏的代码是 Windows 代码,该代码可以打开 + 读取网络上 Web 服务器可以访问的任何文件。

因此,该点击的隐藏代码如下所示:

    Dim btnLink As ImageButton = sender

    Dim lvRow As ListViewDataItem = btnLink.NamingContainer

    Dim ID As Integer = ListView1.DataKeys(lvRow.DisplayIndex).Item("ID")
    Dim cmdSQL As New SqlCommand("SELECT * FROM WebUpLoad WHERE ID = @ID")
    cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = ID
    Dim lvDataRow As DataRow = MyrstP(cmdSQL).Rows(0)

    Dim strInternalFile = lvDataRow("InternalFileName")

因此,请注意 listview(或 GridView)如何不公开 PK 行 ID(使用数据键来避免将 PK ID 暴露给客户端标记)。

然后,我们从数据库中获取文件名。

然后我们将文件发送到浏览器(作为下载)。

    If File.Exists(strInternalFile) Then

        Dim iFileInfo As New FileInfo(strInternalFile)

        strConType = MimeMapping.GetMimeMapping(strInternalFile)

        Response.Clear()
        Response.ContentType = strConType
        Response.AppendHeader("Content-Length", iFileInfo.Length.ToString)
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(strInternalFile))
        Response.TransmitFile(strInternalFile)
        Response.End()

    Else

因此,代码隐藏可以使用 transmitfile()。代码隐藏不限于使用 URL 路径名,而是可以读取 + 打开与 Web 服务器位于同一网络上的任何文件。

所以,毫无疑问,建议永远不要使用,也永远不要有映射到文件的 URL?这是正确的,而且是一个很大的安全漏洞。

唯一的要求是 Web 服务器用户“上下文”需要对该其他服务器的文件权限。您可以为此目的创建非域登录,因此您需要登录同名 + 密码的其他服务器。

目前尚不清楚每个用户是否都有自己的文件夹,或者当他们上传文件时,或者其他什么,那么一些数据库行是可用的。

但是,如上所示,您不希望创建或允许使用这些文件映射到其他“安全”服务器的 Web URL。虽然网站和 URL 仅限于该网站的文件夹,但代码隐藏没有此类限制,并且代码隐藏可以根据任何有效的路径名自由读取和“传输”任何文件。最终结果是没有公开猜测或尝试 URL 的存在,也没有映射到其他服务器上的文件。

评论

0赞 Spike Colman 8/24/2023
多谢!我还没有完全理解它,但我会尝试实施它并在此过程中学习。非常感谢:)