2011-10-10 5 views
3

Suhosin 패치를 계속 사용하고 UTF-8 양식 제출과 함께 사용할 수있는 솔루션을 찾으려면 고심하고 있습니다.PHP 5.3, 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 * override를 활성화했습니다. 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)); 

을 시험 모두 그렇지 않으면 활성화는 true 수호신 패치를 false 반환

UPDATE

난 그냥 확인하기 위해 더 많은 테스트를했다. 문제는 버그입니까 아니면 예상되는 행동입니까? Suhosin 패치에 대한 구성 매개 변수가 멀티 바이트 문자열에 관한 어떤 마법을 수행합니까?

멋진 마음으로 올바른 조언을하지 않는 한이 시점에서 볼 수있는 유일한 옵션은 패치를 비활성화하는 것입니다.

업데이트 2

는 GET 문자열을 손상하지 않고 제대로 브라우저에 표시됩니다. POST 만 현재 수행합니다.

+0

오류가 발생합니다. 또한 오류 로그를 확인하십시오. 또한 mb_ 함수 재정의를 사용하지 말 것을 강력히 권장합니다. 그들은 기존 코드의 * 많은 *을 망칠 것입니다. 필요할 때 mb_ 함수를 항상 명시 적으로 사용하는 것이 더 좋습니다. – Evert

+0

오류가 표시되지 않습니다. 문자열이 잘못 정확하게 디코딩됩니다. – zekus

+1

어떻게 잘못 디코딩됩니까? 당신은 당신의 질문에서 이것을 언급하지 않았습니다. 실제 문제에 대한 세부 사항을 추가하지 말고 – Evert

답변

0

을 다음과 같은 HTML 페이지에 메타 태그에 시도 했나, 내가

Beginning with PHP 4.3.3, if enctype for HTML form is set to multipart/form-data and mbstring.encoding_translation is set to On in php.ini the POST'ed variables and the names of uploaded files will be converted to the internal character encoding as well. However, the conversion isn't applied to the query keys.

이 언급 http://algorytmy.pl/doc/php/ref.mbstring.php 발견 실제로 나에게 많은 것을 의미하지는 않지만 POST 변수가 문제의 핵심

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
<pre><?php echo $_POST['test'];?></pre> 
<form method="post"> 
    <input name="test" type="text"/> 
    <input type="submit" /> 
</form> 
Test string to use: iñtërnâtiônàlizætiøn 
</body> 
</html> 
: 이것은 내가 문제를 재현하는 데 사용되는 PHP 테스트 페이지이며, 참고로

php_admin_value mbstring.language  "Neutral" 
php_admin_value mbstring.encoding_translation "On" 
php_admin_value mbstring.http_input  "UTF-8" 
php_admin_value mbstring.http_output "UTF-8" 
php_admin_value mbstring.detect_order "auto" 
php_admin_value mbstring.substitute_character "none" 
php_admin_value mbstring.internal_encoding "UTF-8" 
php_admin_value mbstring.func_overload "7" 
php_admin_value default_charset "UTF-8" 

:

나는 내 아파치 가상 호스트에서이를 설정하면 나는 당신의 문제를 재현 할 수 발견

나는 다음과 같은 mbstring 설정을 주석 (또는 해제 돌려) 시도 :

; Disable HTTP Input conversion (PHP 4.3.0 or higher) 
mbstring.encoding_translation = Off 

T 그의 내부 문자 인코딩 utf-8이기 때문에, 내게별로 이해가되지 않지만, 문제를 해결하는 것 같습니다.

내가 눈치 또 다른 oddness은 그래서 php_admin_value를 사용하는 경우에만 문제가 될 것으로 보인다 내가 (대신 아파치 가상 호스트의) php.ini에서 직접이 mbstring 값을 설정하면, 내가 encoding_translation의 문제를 재현 할 수 없음을했다?

+0

이 솔루션은 부분적으로이 문제를 해결합니다. 아직도 문자열이 suhosin과 결합 된 mbstring에 의해 손상된 곳을 조사 중입니다. – zekus

0

당신은 Google 검색에서

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" ></meta> 
+0

안녕하세요, Roshan, 서버 헤더는 항상 html 메타를 무시하므로 지정할 필요가 없습니다. 어쨌든 나는 그걸로도 테스트했고 문제는 여전히 거기에 있습니다. – zekus