ASP.NET URL验证

时间:2008-11-17 14:45:43

标签: asp.net iis url

我们在ASP.NET上有一个自定义REST处理程序,它配置如下,以处理所有传入的请求:

<add path="*" verb="*" type="REST.RESTProtocolHandler"/>

但是,传递一个正确编码或根本不编码的管道字符会触发一个似乎来自ASP.NET内部的验证错误。

访问http://localhost:8080/%7chttp://localhost:8080/|会产生此错误:

  

[ArgumentException:路径中的非法字符。]    System.IO.Path.CheckInvalidPathChars(String path)+7489125      System.IO.Path.Combine(String path1,String path2)+40      System.Web.Configuration.UserMapPath.GetPhysicalPathForPath(String path,VirtualDirectoryMapping mapping)+114      System.Web.Configuration.UserMapPath.GetPathConfigFilename(String siteID,VirtualPath path,String&amp; directory,String&amp; baseName)+72      System.Web.Configuration.UserMapPath.MapPath(String siteID,VirtualPath path)+30      System.Web.Configuration.UserMapPath.MapPath(String siteID,String path)+31      System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath,Boolean permitNull)+297      System.Web.Hosting.HostingEnvironment.MapPathInternal(VirtualPath virtualPath,Boolean permitNull)+51      System.Web.CachedPathData.GetConfigPathData(String configPath)+341      System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath,Boolean permitPathsOutsideApp)+110      System.Web.HttpContext.GetFilePathData()+36      System.Web.HttpContext.GetConfigurationPathData()+26      System.Web.Configuration.RuntimeConfig.GetConfig(HttpContext context)+43      System.Web.Configuration.CustomErrorsSection.GetSettings(HttpContext context,Boolean canThrow)+41      System.Web.HttpResponse.ReportRuntimeError(Exception e,Boolean canThrow,Boolean localExecute)+101      System.Web.HttpRuntime.FinishRequest(HttpWorkerRequest wr,HttpContext context,Exception e)+383

没有用户区代码被执行。这是一个配置选项吗?转载于IIS 7&amp; VS Studio的2008年开发服务器。

Stack Overflow似乎处理此错误确定,它看起来像为 https://stackoverflow.com/%7c呈现动态生成的404 MVC页面。

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

尝试拦截Global.asax文件中的异常。在那里实现(Global.asax.cs)这个方法:

protected void Application_Error(Object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    //do whatever you want with that exception
    //or get the url from the context, reformat and redirect
}

答案 1 :(得分:1)

并且它有效。

但是我已经使用IIS7完成了这项工作而没有任何问题,但是在IIS6中我收到了这个错误(路径中的字符非法)。

答案 2 :(得分:0)

我有一个类似的程序拦截所有并用管道尝试它给我同样的错误。我认为它与IIS进行路径测试(mappath)之前有关,它知道谁来处理请求。 你的处理程序采用root(意味着所有调用)但我假设IIS的方式是通用的。

因此,我假设您在文件系统上无法使用的任何或大多数路径字符都将在IIS请求(GET / POST)上失败。

也许有人知道如何禁用IIS检查。根据错误,它似乎甚至在你的web.config被读取之前发生,因为它试图找到正确的配置?,

也许可以使用您自己的错误页面作为重定向回到您的处理程序?

答案 3 :(得分:0)

我认为答案就在你的堆栈跟踪中。在System.IO.Path.CheckInvalidPathChars()调用上抛出错误 - 这不是检查Url,而是检查IIS所在的Windows文件系统。管道角色是Url非法,但基本上是DOS非法。

如果在IIS尝试在服务器上找到匹配路径之前截取Url,我希望您可以处理此错误。这可能在于有一个重写规则或类似的内容,用于查找和重写包含不需要的字符的Url。

答案 4 :(得分:-1)

默认情况下,IIS不允许URL中的某些字符并将其视为非法。这是问题的来源 - 它甚至不会调用您拥有的处理程序。据我所知,除了Windows注册表之外,没有地方可以配置通过UI接受哪些字符。我不知道你为什么要使用烟斗,但我不认为这是好习惯。对于任何异常的错误页面 - you can always have your own error page,以便用户看不到丑陋的消息。