我收到了一个不言自明的错误:
一个潜在的危险请求。日志含义从客户端检测到路径值(*)。
问题是由于请求URL中的*:
https://stackoverflow.com/Search/test*/0/1/10/1
该url用于填充搜索页面,其中“test*”是搜索词,url的其余部分与各种其他过滤器相关。
是否有一种简单的方法允许这些特殊字符出现在URL中?我试过修改网页。配置,毫无用处。
我应该手动编码/解码特殊字符吗?
或者是否有这样做的最佳实践,我希望避免使用查询字符串。-但这可能是一种选择。
应用程序本身是一个c# asp.net webforms应用程序,它使用路由生成上面漂亮的URL。
如果你使用的是。net 4.0,你应该能够通过web.config允许这些url
<system.web>
<httpRuntime
requestPathInvalidCharacters="<,>,%,&,:,\,?" />
</system.web>
注意,我刚刚删除了星号(*),原始的默认字符串是:
<httpRuntime
requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
请参阅这个问题了解更多细节。
对我来说,我正在使用。net 4.5.2和web api 2.0,
我有同样的错误,我设置它只是通过添加requestPathInvalidCharacters=""
在requestPathInvalidCharacters中,你必须设置不允许的字符,否则你必须删除导致这个问题的字符。
<system.web>
<httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
<pages >
<namespaces>
....
</namespaces>
</pages>
</system.web>
**注意这不是一个好的做法,可能一个post用这个参数作为对象属性更好或者尝试编码特殊字符。
在搜索rest api的最佳实践后,我发现在搜索、排序和分页中,我们必须这样处理查询参数
/companies?search=Digital%26Mckinsey
这解决了问题,当我们编码&和替换它的url %26
无论如何,在服务器上我们收到了正确的参数Digital&Mckinsey
这个链接可能有助于设计rest web API的最佳实践
https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9
*字符不允许出现在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");