提问人:Spike Colman 提问时间:8/23/2023 更新时间:8/23/2023 访问量:30
显示客户端无权限的另一台服务器的媒体 (asp.net)
Displaying media from another server where the client has no permission (asp.net)
问:
我的网页(asp.net)应该显示一个非常机密的媒体表,然后在单击时在新窗口中打开文件。
当我将媒体本地放置在 IIS 服务器上的文件夹上并链接到那里的文件时,它工作正常。 但是安全顾问不允许以任何方式(!他说,这意味着最终用户可以访问媒体文件夹,并且由于所有文件(所有其他用户)都在同一个文件夹中,因此他可以看到所有其他媒体。
他的解决方案是将所有媒体存储在另一个文件服务器上,客户端无法访问该服务器,网页将显示该媒体(不授予客户端对其他文件服务器的任何权限)。 因此,基本上,IIS 服务器就像客户端和媒体之间的中间人。
这带来了两个问题:
指向文件服务器媒体的直接链接(完整路径)不会显示任何内容(即使通过记事本创建一个简单的 html 页面,使用相同的链接,它确实有效)。也许 asp.net 由于某种原因不允许完整的网络路径?
我仍然需要用户在单击媒体时在新窗口中打开媒体。现在,它使用指向本地文件位置的 Href 链接。一旦文件没有存储在本地,我该怎么做?
我四处搜索,人们建议从 DNS 服务器创建一个虚拟域,以便它不是“\fileserver\shareName”,而是“www.fakedomain.com\shareName”。这似乎也行不通。
尝试显示来自其他服务器的媒体时的最佳做法是什么? 我真的希望我设法正确地解释了这种情况......
答:
好吧,请记住,基于 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")
因此,请注意 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 的存在,也没有映射到其他服务器上的文件。
评论