使用Server.Transfer()将请求转移到静态图像(.jpg,.png等)是否安全?

时间:2011-02-08 15:46:43

标签: c# asp.net iis

我有一个实现IHttpHandler的类,用于处理图像大小调整请求。它像这样处理Urls

http://mysite.com/imageHandler?image=myimg.jpg&width=100&height=100

目前处理程序在磁盘上查找myimg.jpg,剪切100x100缩略图(如果它尚不存在)并将客户端重定向到缩略图,如此

Response.RedirectPermanent("/some/virtualPath/to/thumbnail.jpg");

这一直很好用,但我想避免强制客户端发出第二个HTTP请求。做以下事情是否安全?

Server.Transfer("/some/virtualPath/to/thumbnail.jpg")

所有MSDN documentation都谈到使用Server.Transfer()重定向到aspx页面,所以我不确定这是否是正确的做法。

谢谢,

2 个答案:

答案 0 :(得分:3)

嗯,MSDN page明确说:

  

转移到的页面应该是另一个.aspx页面。例如,转移到.asp或.asmx页面无效。

因此,即使可能工作,在您可以依赖此功能的意义上也不是“安全”。您通过使用非aspx页面违反contract,因此,理论上,该方法可以任意行为。

针对您的问题的安全解决方案是使用Response对象的适当方法将缩略图发送到客户端,例如BinaryWrite(如果缩略图图像在内存中)或{{1 (如果图像在磁盘上)。在这种情况下,不要忘记适当地设置HTTP标头(TransmitFile)以通知客户端这是一个jpg图像。此方法的另一个优点是您的缩略图文件不需要驻留在Web服务器的可公开访问的目录中。

答案 1 :(得分:0)

不确定最初编写问题时此方法是否存在,但从 .NET 4.8 开始,Server.TransferRequest() 似乎更适合传输静态文件。

参见 MSDN 上的 HttpServerUtility.TransferRequest Method

<块引用>

在 IIS 7.0 中以集成管道模式运行时使用此方法,以允许将请求处理从一种资源类型转移到另一种资源类型,同时使用正确的请求上下文执行目标请求。例如,您可以使用 TransferRequest 方法将针对 ASPX 页面的请求转换为对 XML 页面的请求。