ASP.NET MVC和共享文件夹上的链接照片

时间:2010-01-21 09:30:02

标签: asp.net-mvc

我正在编写asp.net mvc web应用程序,该应用程序使用大量的.jpg文件,这些文件位于Web服务器外部的共享文件夹中,无法通过http协议访问。
如何将图像路径放入 img 标签?

2 个答案:

答案 0 :(得分:6)

不要将图像路径放在图片标记中作为脚本的参数。这被称为直接对象引用,是一件坏事。考虑这样一个脚本/页面/控制器的天真实现,它可以用作/image/?resource=\server\path\img.jpg。

现在如果有人加载/ image / resource /?resource = c:\ windows \ system32 \ config \ SAM会发生什么?您的密码数据库已发送。

您根本不想使用完全限定的路径,理想情况下,您希望提供该目录中的所有图像,只接受文件名,通过执行类似

的操作从中删除任何路径信息
string filename = Path.GetFileName(userInputtedFilename);
FileInfo file = new FileInfo(Server.Path.Combine("\\Server\share\", filename)));

这至少是安全的,但当然用户可以浏览所有图像,只要它们被恰当地命名。更安全的是有一个间接对象引用,一个映射表,它将GUID之类的东西映射到实际的文件名,并将其用作服务脚本的参数。

要提供文件,请从控制器返回FileContentResult

public FileContentResult GetFile(Guid indirectReference)
{
  byte[] fileContents = // Resolve the file and read it from the indirect reference      
  mimeType = // Suitable MIME type
  return File(fileContent, mimeType, fileName);
}

答案 1 :(得分:0)

如果Web服务器具有对该共享的常规网络访问权限并且可以读取映像文件,则可以创建一个新的MVC控制器Image,其默认操作Index采用一个名为{{1的字符串参数}}。该操作将从参数创建新的fn。然后,当您生成FileResult代码时,请将网址设置为<img>。 (当然,别忘了为它添加正确的路线)

如果网络服务器无权访问该共享,但页面用户有权访问,您可以尝试将/image/?fn=\\share\image.png标记设置为图片的<img>网址。但是,这将是脆弱的,可能会或可能不会,取决于用户的操作系统和浏览器配置。

更新:请阅读答案中提到的安全隐患@blowdart。