apache:查询字符串(URL)中的转义变音符号导致 403
Posted
技术标签:
【中文标题】apache:查询字符串(URL)中的转义变音符号导致 403【英文标题】:apache: escaped umlauts in query string (URL) lead to 403 【发布时间】:2011-06-19 06:23:11 【问题描述】:我有一个我以前从未遇到过的问题,我认为这与我不太熟悉的 apache 配置有关。
首先,有一个带有搜索表单的 php 脚本。表单通过 POST 传输。
然后是搜索命中的结果列表。这里原始搜索查询作为 url 的一部分传递,例如:search.php?id=1234&query=foo。这也有效 - 只要没有传输元音变音 (äöüÄÖÜß...) 字符。
只要我在搜索查询中包含变音符号,第一部分将查询字符串作为 POST 传输,但在 URL 中传递它(urlencoded)会导致 403。
所以:
search.php?id=1234&query=bar
工作
search.php?id=1234&query=b%E4r
导致 403 (%E4 = "ä" utf-8 urlencoded)
search.php?id=1234&query=b%C3%A4r
导致 403 (%C3%A4 = "ä" utf-8 urlencoded)
通过 POST 作品提交变音符号
我将应用程序从 iso-8859-1 转换为 utf-8,但这没有任何区别。
我还在我的本地机器上对其进行了测试,在这里它可以完美运行 - 正如预期的那样。
远程服务器设置(不起作用):
Apache/2.2.12 (Ubuntu), PHP 版本 5.2.10-2ubuntu6.7,Suhosin 补丁 0.9.7,通过 CGI/FastCGI
本地设置(此处相同):
Apache/2.2.8 (Win32) PHP/5.3.5 PHP 版本 5.3.5 通过 mod_php
有人知道为什么远程 apache/php-cgi 不接受 url 中正确的 urlencoded umlauts 吗?
附加信息:我还尝试创建一个名称中带有变音符号的静态文件,/t%C3%A4st.php
和 /täst.php
都可以正常使用。 täst.php?foo=täst
失败。
注意:?foo=%28
,其中 %28 是“(”,也可以。
【问题讨论】:
迂腐,我知道,但“ß”没有变音符号... 对不起 :) 这种特殊字符的超集是怎么命名的? 你有没有一些规则被破坏的类似 mod_security 的模块?像 àéù 这样的非 ascii 字符也会发生这种情况吗? àáéèùú 也不起作用。 ascii 字符有效,非 ascii 无效。 @user576875:抱歉,我无法回答有关 mod_security 的问题。 phpinfo 说安装了 suoshin 和 ioncube loader。我无权访问任何配置指令。 【参考方案1】:Apache 不会转义,浏览器会。
您需要使用urlencode 和urldecode 来避免此类字符出现问题。
一些浏览器,比如旧的 Netscape,只是发送写好的 url,其中包含 8 位字符。其他人,特别是 MSIE,在将 URL 发送到 Web 服务器之前将其编码为 UTF-8,因此一个 8 位字符作为两个字符到达,其中第一个字符设置了第 8 位。在请求标头或其他地方没有任何迹象表明该 url 是用 UTF-8 编码的。
【讨论】:
我知道这一点。但我怀疑如果 url 中有某些字符,一些 apache 配置/错误配置的安全模块会阻止请求。 另一个问题是 urldecode 应该在 php 中自动完成,所以这应该不会导致问题,但是如果您使用 403 服务必须是 apache,如果它进入 php 并出错错误将是 500, 403 表示 apache 无法像获取字符串一样加载文件,这必须是在 apache 服务器上设置的规则以上是关于apache:查询字符串(URL)中的转义变音符号导致 403的主要内容,如果未能解决你的问题,请参考以下文章