我有一个ASP.NET MVC应用程序,其路由允许通过/ search / 搜索内容。
当我提供“ search / abc”时,它运行良好,但是当我提供“ / search / a + b + c”(正确的url编码)时,IIS7拒绝请求,并显示HTTP错误404.11( 请求过滤模块配置为拒绝包含双重转义序列的请求 )。首先,为什么要这样做?如果它只是URL的一部分,但似乎不是查询字符串的一部分,似乎只会引发错误(/ transmit?q = a + b + c可以正常工作)。
现在,我可以在web.config的安全性部分中启用双重转义请求,但由于我不了解其含义,而且我也很犹豫,因此服务器也拒绝将请求“ a + b + c”拒绝为URL的一部分,但接受作为查询字符串的一部分。
有人可以解释并给出建议怎么办吗?
编辑: 在相关部分增加了重点。
基本上:IIS过于偏执。如果您对uri解码的数据没有做任何特别不明智的事情(例如通过字符串串联生成本地文件系统URI),则可以安全地禁用此检查。
要禁用该检查,请执行以下操作(从此处开始):(请参阅下面的评论,以了解需要进行何种双重转义)。
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true"/> </security> </system.webServer>
如果加号在搜索输入中是有效字符,则 需要 启用“ allowDoubleEscaping”以允许IIS从URI的路径处理此类输入。
最后,一个非常简单的方法(如果受限制的话)只是避免使用“ +”,而是使用“%20”。 在任何情况下,使用’+’符号对空格进行编码 都不 是有效的url编码,而是特定于一组有限的协议,并且可能由于向后兼容的原因而得到广泛支持。如果仅出于规范化目的,最好还是将空格编码为’%20’。并且很好地避开了IIS7问题(对于其他序列,例如%25ab,它仍然可以冒出来)。