【问题标题】:Why would Apache be URL decoding my query string?为什么 Apache 会对我的查询字符串进行 URL 解码?
【发布时间】:2009-01-14 20:47:51
【问题描述】:

我的网络主机拒绝帮助我解决这个问题,所以我来这里寻求一些“黑盒调试”的帮助。这是我发送给他们的经过编辑的版本:

我在 dreamhost 有两个(除其他外)域:

1) thefigtrees.net 2) shouldivoteformccain.com

我今天注意到,当我在 #1 上托管 CGI 脚本时, CGI 脚本运行,HTTP GET 查询字符串作为 QUERY_STRING 传递给它 环境变量已经被 URL 解码。这是一个问题,因为 这意味着标准 CGI 库(例如 perl 的 CGI.pm)将尝试 在&符号上拆分,然后对字符串本身进行解码。那里有两个 潜在的问题:

1) 字符串是双重解码的,所以如果一个值被提交给脚本 例如“%2525”,它最终将被视为只是“%”(解码两次) 而不是“%25”(解码一次)

2) (更常见的)如果提交的值中有一个&符号,那么它 将(正确)作为 %26 提交,但 QUERY_STRING 环境。变量将 已经将其解码为“&”,然后 CGI 库将不正确 在该&符号处拆分查询字符串。这是个大问题!

http://thefigtrees.net/test.cgi 的脚本演示了这一点。它回响了 调用它的环境变量。在浏览器中导航到:

http://thefigtrees.net/lee/test.cgi?x=y%26z

您可以看到 REQUEST_URI 正确包含 x=y%26z(未编码),但是 QUERY_STRING 已将其解码为 x=y&z。 如果我在域 #2 重复测试( http://www.shouldivoteformccain.com/test.cgi?x=y%26z ) 我看到 QUERY_STRING 保持未解码,因此 CGI.pm 然后拆分和解码 正确。

我尝试在两者上禁用我的 .htaccess 文件,以确保这不是 问题,并没有看到任何区别。

由于我的网络主机似乎不愿意帮助我,有人能推测出这种情况的潜在原因吗?

谢谢, 李

【问题讨论】:

    标签: apache cgi query-string urldecode


    【解决方案1】:

    我在 Apache 中也有同样的行为。

    如果安装了 mod_rewrite,我相信它会自动解码 URL,但是,即使没有它,我也看到了自动解码行为。我还没有找到另一个罪魁祸首。

    一种常见的解决方法是对输入参数进行双重编码(利用在未编码的 URL 上调用时 URL 解码是安全的)。

    【讨论】:

      【解决方案2】:

      好奇。从这里我看不到任何东西可以告诉我们为什么会发生这种情况......我只能确认这是一个环境错误,并怀疑可能是配置差异,比如可能重写规则。

      根据 CGI 1.1,这种解码应该只发生在 SCRIPT-NAME 和 PATH-INFO,而不是 QUERY-STRING。发生这种情况毫无意义且令人讨厌,但这就是规范。使用 REQUEST-URI 而不是那些可用的变量(即 Apache)是您想要在路径部分中放置越界和 Unicode 字符的地方的常见解决方法,因此对查询字符串执行相同操作可能是合理的直到主机提供某种解决方案。

      现在 VPS 很便宜...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-16
        • 2019-01-20
        • 2020-09-10
        • 2012-10-17
        • 1970-01-01
        • 2014-12-15
        • 2014-01-20
        • 1970-01-01
        相关资源
        最近更新 更多