| | | | | | | [文章信息] | | | 作者: | | | 时间: | 2003-09-26 | | 出处: | Microsoft | | 责任编辑: | 方舟 | |
| [文章导读] | | | 从程序集提供图像可以避免众多文件散布在磁盘上,简化 Web 服务器的安装和配置 | |
| |
|
| | | |
|
|
|
|
|
安全性
到目前为止的讨论中,我们一直基于程序集名称和资源名称提供图像。这没什么不好,但这意味着任何人都可以得到磁盘上的程序集名称,并可以尝试通过将其他程序集名称传递给处理程序来进行攻击。
为了避免这个潜在的问题,最好用某种方法对返回的值进行加密。我们可以提供一些从程序集名称和图像名称生成的散列码,或使用程序集名称和图像名称的加密格式,然后在接收到请求后再进行解密。
前一种方法(使用散列码)需要服务器中有查找表,并且表中为每个提供的图像填充了内容。这就给 Web 领域带来一个潜在的问题。在 Web 领域,可能一个服务器提供初始图像请求(并缓存散列码),而另一个服务器实际响应图像。
因此,我选择了第二种方法,即在返回到用户的 URL 中包含加密的程序集名称和图像名称。这样就不会遇到 Web 领域中存在的问题,但却意味着需要从浏览器多传送一些数据到服务器,因为图像 URL 要长一些。
示例代码包含一个类,它使用 Triple-DES(数据加密标准)算法加密和解密字符串。通常,程序集名称和图像名称在传递到客户端之前已进行了加密。当请求图像时,这些值被解密,并调用与原来相同的代码。
我已将这些内容以可配置的方式添加到解决方案中。在 web.config 中仅有一个标志,如果设置为“true”,则会在向客户端提供资源名称时对其进行加密:
<appSettings> <add key="MFRSecure" value="true" /> </appSettings> | 在处理程序的 ProcessRequest 方法中,我对此标记进行检查:
bool secure = false ; string shouldSecure = ConfigurationSettings.AppSettings["MFRSecure"] ;
if ( null != shouldSecure ) secure = Convert.ToBoolean ( shouldSecure ) ;
string assembly = context.Request.QueryString["assem"] ; string image = context.Request.QueryString["image"] ;
if ( secure ) { assembly = Crypto.Decrypt ( assembly ) ; image = Crypto.Decrypt ( image ) ; }
ManifestImageLoader.RenderImage ( assembly , image ) ;
| 类似地,在前面介绍的 ConstructImageURL 方法中,在程序集名称和图像名称被传递给客户端之前,我对它们进行了加密。
代码的很多部分都可以进行扩展或改进。下面是我的几点建议。
当无法找到资源时,配置项不对使用的图像进行硬编码,而是指定图像的 URL。这样在出现异常时,您就可以从磁盘(或从其他程序集)加载特定的图像并将其返回到浏览器。
图像的缓存超时也可以定义为配置项。
可以扩展代码,以允许从程序集提供任何类型的图像 - 目前,mime 类型被硬编码为 image/GIF。 对于为何此示例中的代码不能提供程序集内的其他资源,没有什么原因 - 您完全可以提供 TXT 文件、WAV 文件等。
小结
本文介绍了两种方法,用于从程序集检索格式适合包含在 Web 站点中的图像。第一种方法是从 ASPX 页面提供图像,这种方法简单而且不需要修改 Web 服务器配置,但是提供图像的 ASPX 页面的路径必须正确,以使图像能够正确显示。
另一种方法是从自定义处理程序提供图像。这种方法克服了基于路径的限制,但需要更改 IIS 配置数据库,以允许由 aspnet_isapi.dll 扩展程序提供 .mfr 扩展名。而且还要为给定的应用程序修改 web.config。
我个人建议使用处理程序方法而不要使用 ASPX 方法,因为在 Web 服务器中配置处理程序方法后,使用起来会更容易(而且不需要路径)。
|
|
|
|
|
|
|
|