我正在努力寻找一种解决方案来继续使用 Suhosin 补丁并使其适用于 UTF-8 表单提交。这是我做的非常简单的测试:
<?php var_dump($_POST); ?>
<form method="post">
<input name="test" type="text"/>
<input type="submit" />
</form>
使用字符串iñtërnâtiônàlizætiøn。显然,我首先在服务器上启用了 utf-8 标头,并将 Php default_charset 设置为 utf-8,并启用了 mb* 覆盖。一旦我禁用 Suhosin 补丁并重新提交表单,一切都会正常运行。
更新
为了确定,我做了更多的测试:
$test = $_POST['test'];
var_dump(mb_detect_encoding($test, "UTF-8", true));
// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
} // function is_utf8
var_dump(is_utf8($test));
在启用 Suhosin 补丁的情况下,这两个测试都返回 false,否则返回 true。问题是:这是一个错误还是预期的行为?Suhosin 补丁是否有一个配置参数,它对多字节字符串有什么魔力?
在这一点上我看到的唯一选择是禁用补丁,除非聪明的头脑给出正确的建议。
更新 2
GET 字符串不会被损坏,并且会正确显示在浏览器中。目前只做 POST 。