ASP.NET 4的URL限制:为什么URL不能包含任何%3f字符

9
http://site.com/page%3fcharacter

此URL将返回以下错误:
Illegal characters in path.

我已经将这个放在了web.config文件中:

<system.web>
<httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="" />
<pages validateRequest="false"> 
...

我该如何修复这个错误?
3个回答

29

如果你想允许请求通过,你需要添加 requestPathInvalidCharacters 并将其设置为空字符串:

<system.web>
    <httpRuntime requestPathInvalidCharacters="" />
</system.web>

编辑: 你应该保留原来的问题,因为现在我的回答已经没有意义了。

但是回答你的第二个问题,这是因为%3f对应着'?',而在Windows文件名中不允许使用'?'。你可以将relaxedUrlToFileSystemMapping属性设置为true以更改此行为:

<system.web>
    <httpRuntime requestPathInvalidCharacters=""
                 relaxedUrlToFileSystemMapping="true" />
</system.web>
你可能需要浏览 HttpRuntimeSection 类中的所有属性,看看是否有其他适用的属性。

你也可以实现一个 RequestValidator 的子类,并设置你的 web.config 使用你的子类(这将允许所有 URL 通过)。但是,就我个人而言,我不会费心去改变内置类的处理方式。普通用户很少会在路径中意外输入 "%3f",何必要花那么多力气来改进恶意用户的使用情况呢?

顺便说一下,这实际上是 ASP.NET 4 中的一个新功能,这就是为什么 Stack Overflow 不会出现错误:它正在运行 .NET 3.5。


那解决了问题。但是我在另一个URL上遇到了另一个错误。我会编辑问题。 - stacker
  1. 重写路径。
  2. 返回空白页面(或自定义错误页面)。
  3. 重定向到主页。我想拥有决定如何响应此类错误的权力。
- stacker
我可以为此编写集成测试吗?http://stackoverflow.com/questions/2831075/integrationtests-a-potentially-dangerous-request-path-value-was-detected-from-t - stacker
你好,我已经使用了"relaxedUrlToFileSystemMapping="true"",但它不能在线上运行,只能在我的本地工作。 - Karthic G

14

2

可能是因为它看起来很像一个格式不正确的URL。

& 用作查询字符串参数的分隔符,例如:site.com/page?some=20&another=15


没错。但是想象一下,如果有人向您的网站发布了这样的URL,用户会看到这样的错误信息...这很令人困惑! - stacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接