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

问题描述 投票:0回答:1

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

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

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

这带来了两个问题:

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

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

我四处搜索,人们建议从 DNS 服务器创建一个虚拟域,这样就可以将“ileserver\shareName”更改为“www.fakedomain.com\shareName”。这似乎不太有效。

尝试显示来自另一台服务器的媒体时的最佳实践是什么? 我真的希望我能够正确解释情况......

asp.net security fileserver
1个回答
0
投票

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

但是,代码隐藏则没有这样的限制。

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

所以,假设我有这两个文件,文件列表基于用户的登录:

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

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

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

请记住,背后的代码是 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")

因此,请注意列表视图(或 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

所以,后面的代码可以使用transmistFile。并且后面的代码不限于使用 URL 路径名,而是可以读取并打开与 Web 服务器位于同一网络上的任何文件。

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

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

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

但是,如上所示,您不想创建也不想允许使用这些文件映射到其他“安全”服务器的 Web URL。虽然网站和 URL 仅限于该网站的文件夹,但代码隐藏没有这样的限制,并且代码隐藏可以根据任何有效路径名自由读取和“传输”出任何文件。

© www.soinside.com 2019 - 2024. All rights reserved.