从客户端检测到潜在危险的Request.Path值(*)

210 c# asp.net url routing webforms

我收到了相当自我解释的错误:

从客户端(*)检测到潜在危险的Request.Path值.

问题是由*请求URL引起的:

https://stackoverflow.com/Search/test*/0/1/10/1
Run Code Online (Sandbox Code Playgroud)

此网址用于填充搜索页面,其中"test*"是搜索字词,其余网址与各种其他过滤条件相关.

是否有一种简单的方法可以在URL中允许这些特殊字符?我试过修改web.config,但无济于事.

我应该手动编码/解码特殊字符吗?或者有这样做的最佳实践,我想避免使用查询字符串. - 但它可能是一种选择.

应用程序本身是一个c# asp.netwebforms应用程序,它使用路由生成上面的漂亮URL.

Dav*_*som 306

如果您使用的是.NET 4.0,则应该可以通过web.config允许这些URL

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

注意,我刚刚删除了星号(*),原始的默认字符串是:

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此问题.

  • 有什么方法可以在动作上使用mvc属性这样做,所以我不必为整个应用程序关闭它?与此答案类似:http://stackoverflow.com/a/1540976/298758 (5认同)
  • @longda:也许尝试用你需要的URL的<location path ="my/path">元素包装它.从全局的角度来看,使用反射会相当简单,但我不确定是按照每个控制器/操作来设置它.也许开始一个问题? (4认同)

Guf*_*ffa 95

*URL的路径中不允许使用该字符,但在查询字符串中使用该字符没有问题:

http://localhost:3286/Search/?q=test*
Run Code Online (Sandbox Code Playgroud)

这不是编码问题,*角色在URL中没有特殊含义,因此无论您是否对其进行URL编码都无关紧要.您需要使用不同的方案对其进行编码,然后对其进行解码.

例如,使用任意字符作为转义字符:

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");
Run Code Online (Sandbox Code Playgroud)

并解码:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");
Run Code Online (Sandbox Code Playgroud)

  • "xxx""xxy""xyy"游戏非常聪明.您可能希望详细说明其背后的逻辑,以免混淆读者. (13认同)
  • 请求是在`PATH`中使用它而不是在查询字符串中. (2认同)
  • 不能使用 `aa` &lt;=&gt; `a` 和 `ab` &lt;=&gt; `*` 作为更简单的编码方案吗? (2认同)

Tej*_*ejs 6

您应该对路由值进行编码,然后(如果需要)对值进行解码,然后再进行搜索。


MNF*_*MNF 6

对我来说,我正在使用Web api 2.0在.net 4.5.2上工作,我遇到了相同的错误,我只是通过在requestPathInvalidCharacters中添加requestPathInvalidCharacters =“”来设置它,您必须设置不允许的字符,否则您必须删除那些造成这个问题。

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>
Run Code Online (Sandbox Code Playgroud)

**请注意,这不是一个好习惯,可能是带有此参数的帖子,因为对象的属性更好,或者尝试对特殊字符进行编码。-在搜索设计rest api的最佳实践之后,我发现在搜索,排序和分页中,我们必须像这样处理查询参数

/companies?search=Digital%26Mckinsey
Run Code Online (Sandbox Code Playgroud)

这解决了当我们对&进行编码并通过%26将其重新放置在url上时的问题,在服务器上,我们收到了正确的参数Digital&Mckinsey

此链接可能有助于设计其余Web API的最佳实践 https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9