一尘不染

启用双重转义有危险吗?

c#

我有一个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的一部分,但接受作为查询字符串的一部分。

有人可以解释并给出建议怎么办吗?


阅读 692

收藏
2020-05-19

共1个答案

一尘不染

编辑: 在相关部分增加了重点。

基本上:IIS过于偏执。如果您对uri解码的数据没有做任何特别不明智的事情(例如通过字符串串联生成本地文件系统URI),则可以安全地禁用此检查。

要禁用该检查,请执行以下操作(从此处开始):(请参阅下面的评论,以了解需要进行何种双重转义)。

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

如果加号在搜索输入中是有效字符,则 需要 启用“ allowDoubleEscaping”以允许IIS从URI的路径处理此类输入。

最后,一个非常简单的方法(如果受限制的话)只是避免使用“ +”,而是使用“%20”。 在任何情况下,使用’+’符号对空格进行编码 都不
是有效的url编码
,而是特定于一组有限的协议,并且可能由于向后兼容的原因而得到广泛支持。如果仅出于规范化目的,最好还是将空格编码为’%20’。并且很好地避开了IIS7问题(对于其他序列,例如%25ab,它仍然可以冒出来)。

2020-05-19