前天用skipfish把网站扫描了一下,发现了一堆
is not a valid virtual path错误,检查了一下,都是通过访问类似这样的url造成的:
test.com/test.aspx/%3bskipfish.invalid%3b%3f
仔细检查了一下,发现是pathinfo中包含“?”的转义符“%3f”造成的,在调用System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options)方法时抛出的异常。
看了一下VirtualPath的实现,发现存在以下无效字符都会被拒绝:
char[] s_illegalVirtualPathChars = new char[] { ':', '?', '*', '\0' };
试验了一下,其他字符都会在iis级别就被拒绝,可能iis也会处理这些字符;只有%3f会出现经典的asp.net黄色背景页面。
以上这些字符都无法通过web.config中定义的customErrors节点处理,即使能处理也只有%3f能够处理,所以只能在global.asax的Application_Error方法中处理,当然也可以通过注册HttpHandler或HttpModule来处理。
前面这个问题是在asp.net 2.0(无论是经典模式还是集成模式)中出现的,在asp.net 4.0中也存在这些问题,只不过asp.net 4.0多了个url routing,所以情况又有所不同。
asp.net 4.0中的无效字符貌似多了一些,引用http://msdn.microsoft.com/zh-cn/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters.aspx:
<,>,*,%,&,:,\,?
网站运行在asp.net 4.0经典模式下的时候,都会由iis直接抛出错误。
运行在asp.net 4.0集成模式下的时候,customErrors设置可以生效了,如果要避免以上字符抛出异常,则可以在web.config中设置如下:
<pages validateRequest="false"></pages>
<httpRuntime requestPathInvalidCharacters=""></httpRuntime>
当然为了安全考虑,尽量不要这样去做。
嗯嗯,貌似4.0的配置选项又多了好多,有时间得看看去,就这样了。