代码改变世界

web.config customErrors无法处理的is not a valid virtual path

2010-11-23 20:34 囧月 阅读(...) 评论(...) 编辑 收藏

    前天用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.asaxApplication_Error方法中处理,当然也可以通过注册HttpHandlerHttpModule来处理。

    前面这个问题是在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的配置选项又多了好多,有时间得看看去,就这样了。