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


218

我收到了相当不言自明的错误:

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

该问题是由于*请求网址中的原因:

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

该URL用于填充搜索页面,其中“ test *”是搜索词,其余URL与各种其他过滤器有关。

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

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

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


1
您的页面是否ValidateRequest=false位于顶部?
尼尔·奈特,

我不知道网站是出于什么原因在内部尝试进行重定向,而该重定向正在创建类似“ localhost /:// localhost / myWebsiteName ” 的URL ,这给了我同样的错误。我不知道为什么ASP.net管道将其视为危险的请求URL。
RBT

Answers:


97

*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");

15
“ xxx”,“ xxy”,“ xyy”游戏非常聪明。您可能想详细说明其背后的逻辑,以免使读者感到困惑。
SimpleVar 2014年

2
请求是在PATH而不是在querystring中使用它。
Hugo Delsing 2015年

我遇到了同样的情况,其中我的参数之一是URL。即使经过正确的URL编码,我也会收到此错误。我最终只是对base64编码了参数(并在我的api中解码),这比试图弄清楚发生了什么要容易得多。也可能是实现自己的替换例程的更好选择。
SpokaneDJ

1
您不能使用aa<=> aab<=> *作为更简单的编码方案吗?
像Jared这样的词,

现在,这救了我,谢谢,但是在适当的时候,我想查看以下建议:stackoverflow.com/a/603962/1830909,如果您听到您的想法,我将很高兴。
QMaster

316

如果您使用的是.NET 4.0,则应该能够通过web.config允许这些网址

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

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

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

有关更多详细信息,请参见此问题


5
有什么办法在动作上使用mvc属性来执行此操作,这样我就不必为整个应用关闭此功能?与此处的答案类似:stackoverflow.com/a/1540976/298758
隆达

4
@longda:也许尝试用<location path =“ my / path”>元素将其包装为所需的网址。从全局的角度来看,使用反射会相当简单,但是我不确定要针对每个控制器/动作进行设置。也许开始提问?
Dave Transom

它只是在ASP.net MVC项目上不起​​作用,正在接受运行过程以确定viewStart中的布局,但出现以下错误:路径中的字符非法。
QMaster

7

对我来说,我正在使用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将其重新放置在url上时的问题,在服务器上,我们收到了正确的参数Digital&Mckinsey

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


6

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


感谢您的答复。您是说effectivley对*等项目进行替换,然后在阅读时将其替换回去吗?

您能否显示编码和解码值的代码示例?
Ciaran Gallagher

1

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

例如:

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

应该是:

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


是的,对我来说也一样url.com/endpoint¶meter=SomeValue&otherparameter=AnotherValue
Bhargav Konda

0

此异常发生在我的应用程序中,并且具有误导性。

当我使用ajax方法调用调用.aspx页面Web方法并传递JSON数组对象时,抛出该错误。网页方法签名包含一个强类型.NET对象OrderDetails的数组。Actual_Qty属性定义为int,并且JSON对象Actual_Qty属性包含“ 4”(多余的空格字符)。除去多余的空间后,就可以进行转换了,ajax调用成功达到了Web Page方法。


0

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


0

在处理统一资源定位符(URL)时,存在某些语法标准,在这种特殊情况下,我们正在处理保留字符

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

最佳做法是在URL中使用“未保留的字符”,或者您可以尝试对其进行编码。

继续挖掘:


1
如果URL中的保留字符经过百分比编码(例如,%25而不是)%,也会发生此错误,因此IIS可能会针对完全有效的URL返回此错误。
弗洛里安(Florian Winter)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.