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

时间:2011-05-11 15:51:28

标签: c# asp.net url routing webforms

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

  

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

问题是由于请求网址中的*

https://stackoverflow.com/Search/test*/0/1/10/1

此网址用于填充搜索页面,其中“test *”是搜索字词,其余网址与其他各种过滤器相关。

是否有一种简单的方法可以在URL中允许这些特殊字符?我尝试修改web.config,但没有用。

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

应用程序本身是一个c# asp.net网络表单应用程序,它使用路由生成上面的网址。

9 个答案:

答案 0 :(得分:292)

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

来允许这些URL
<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

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

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

有关详细信息,请参阅this question

答案 1 :(得分:91)

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

http://localhost:3286/Search/?q=test*

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

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

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");

解码:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");

答案 2 :(得分:5)

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

答案 3 :(得分:4)

对我来说,我正在使用web api 2.0开发.net 4.5.2, 我有同样的错误,我只是通过添加requestPathInvalidCharacters =“”来设置它 在requestPathInvalidCharacters中你必须设置不允许的字符,否则你必须删除导致此问题的字符。

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>

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

/companies?search=Digital%26Mckinsey

这解决了我们编码时的​​问题。并在%26上将其重新放在网址上 无论如何,在服务器上我们收到正确的参数Digital&amp; Mckinsey

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

答案 4 :(得分:0)

此异常发生在我的申请中,并且具有误导性。

当我使用ajax方法调用调用.aspx页面Web方法时,抛出它,传递一个JSON数组对象。 Web页面方法签名包含一个强类型.NET对象的数组OrderDetails。 Actual_Qty属性定义为int,JSON对象Actual_Qty属性包含“4”(额外空格字符)。 删除额外空间后,转换成为可能,ajax调用成功访问了Web Page方法。

答案 5 :(得分:0)

在处理统一资源定位器(URL)时,有一定的syntax standards,在这种情况下,我们正在处理保留字符

直到RFC 3986,保留字符可以(或可能不)通过通用语法,每种特定于方案的语法或URI的特定于实现的语法定义为分隔符。解除引用算法;星号(*)是保留字符。

最佳做法是在网址中使用Unreserved Characters,或者您可以尝试对其进行编码。

继续挖掘:

答案 6 :(得分:0)

如果它是IIS Express,请尝试将Web项目的服务器设置为本地IIS。确保项目URL是否正确并创建虚拟目录。

答案 7 :(得分:0)

对我来说,键入URL时,用户不小心使用了/而不是?启动查询参数

例如:

  

url.com/endpoint/parameter=SomeValue&otherparameter=另一个+值

应该是:

  

url.com/endpoint?parameter=SomeValue&otherparameter=另一个+值

答案 8 :(得分:0)

我在 Azure 数据工厂中遇到了类似的问题,带有 : 字符。

我通过将 : 替换为 %3A

解决了问题

如图所示here

例如,我替换了

date1=2020-01-25T00:00:00.000Z

date1=2020-01-25T00%3A00%3A00.000Z