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