mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-03 16:51:40 +09:00
https://github.com/xpressengine/xe-core/issues/634 # Internet Explorer send punycode URL(ASCII) URL and non-alphabet Unicode URL URL as a referer. 인터넷 익스플로러는 리퍼러 주소로 퓨니코드 주소와 유니코드 URL을 섞어 쓰고 있습니다. AJAX 통신에는 리퍼러로 Unicode를 사용하고 요청 호스트로는 퓨니코드 URL을 사용(이건 다국어 주소 형식으로 접속하려면 이렇게 했어야 할 것)합니다. - XE strictly compare referer and server host for denying CSRF, but punycode URL and Unicode URL should be dealt as a same one. 그런데 XE는 리퍼러의 호스트와 서버 호스트를 비교합니다. punycode로 쓰인 주소와 Unicode로 쓰인 주소는 같은 주소를 지시하더라도 문자열이 다릅니다. 같은 주소를 지칭하는 다른 문자열을 punycode로 변환해서 같은 주소라고 인식할 수 있게 수정했습니다. - Fix checkCSRF function to deal both form as a same one. - Convert Unicode URL input to punycode URL on the Admin Default URL Settings. 관리자가 유니코드 형식으로 기본 주소를 입력하더라도, 퓨니코드로 변환해 저장하도록 했습니다. 퓨니코드로 저장하는 것이 여러모로 유용하기 때문입니다. - For converting punycode URL, include IDNA coverting class. 퓨니코드와 유니코드 간 변환을 위해서 IDNA 변환 클래스(LGPL사용권)를 포함시켰습니다.
137 lines
No EOL
4.5 KiB
PHP
137 lines
No EOL
4.5 KiB
PHP
<?php
|
|
/**
|
|
* transcode wrapper functions
|
|
* @package IDNA Convert
|
|
* @subpackage charset transcoding
|
|
* @author Matthias Sommerfeld, <mso@phlylabs.de>
|
|
* @version 0.1.0
|
|
*/
|
|
|
|
/**
|
|
* Convert a string from any of various encodings to UTF-8
|
|
*
|
|
* @param string String to encode
|
|
*[@param string Encoding; Default: ISO-8859-1]
|
|
*[@param bool Safe Mode: if set to TRUE, the original string is retunred on errors]
|
|
* @return string The encoded string or false on failure
|
|
* @since 0.0.1
|
|
*/
|
|
function encode_utf8($string = '', $encoding = 'iso-8859-1', $safe_mode = false)
|
|
{
|
|
$safe = ($safe_mode) ? $string : false;
|
|
if (strtoupper($encoding) == 'UTF-8' || strtoupper($encoding) == 'UTF8') {
|
|
return $string;
|
|
} elseif (strtoupper($encoding) == 'ISO-8859-1') {
|
|
return utf8_encode($string);
|
|
} elseif (strtoupper($encoding) == 'WINDOWS-1252') {
|
|
return utf8_encode(map_w1252_iso8859_1($string));
|
|
} elseif (strtoupper($encoding) == 'UNICODE-1-1-UTF-7') {
|
|
$encoding = 'utf-7';
|
|
}
|
|
if (function_exists('mb_convert_encoding')) {
|
|
$conv = @mb_convert_encoding($string, 'UTF-8', strtoupper($encoding));
|
|
if ($conv) return $conv;
|
|
}
|
|
if (function_exists('iconv')) {
|
|
$conv = @iconv(strtoupper($encoding), 'UTF-8', $string);
|
|
if ($conv) return $conv;
|
|
}
|
|
if (function_exists('libiconv')) {
|
|
$conv = @libiconv(strtoupper($encoding), 'UTF-8', $string);
|
|
if ($conv) return $conv;
|
|
}
|
|
return $safe;
|
|
}
|
|
|
|
/**
|
|
* Convert a string from UTF-8 to any of various encodings
|
|
*
|
|
* @param string String to decode
|
|
*[@param string Encoding; Default: ISO-8859-1]
|
|
*[@param bool Safe Mode: if set to TRUE, the original string is retunred on errors]
|
|
* @return string The decoded string or false on failure
|
|
* @since 0.0.1
|
|
*/
|
|
function decode_utf8($string = '', $encoding = 'iso-8859-1', $safe_mode = false)
|
|
{
|
|
$safe = ($safe_mode) ? $string : false;
|
|
if (!$encoding) $encoding = 'ISO-8859-1';
|
|
if (strtoupper($encoding) == 'UTF-8' || strtoupper($encoding) == 'UTF8') {
|
|
return $string;
|
|
} elseif (strtoupper($encoding) == 'ISO-8859-1') {
|
|
return utf8_decode($string);
|
|
} elseif (strtoupper($encoding) == 'WINDOWS-1252') {
|
|
return map_iso8859_1_w1252(utf8_decode($string));
|
|
} elseif (strtoupper($encoding) == 'UNICODE-1-1-UTF-7') {
|
|
$encoding = 'utf-7';
|
|
}
|
|
if (function_exists('mb_convert_encoding')) {
|
|
$conv = @mb_convert_encoding($string, strtoupper($encoding), 'UTF-8');
|
|
if ($conv) return $conv;
|
|
}
|
|
if (function_exists('iconv')) {
|
|
$conv = @iconv('UTF-8', strtoupper($encoding), $string);
|
|
if ($conv) return $conv;
|
|
}
|
|
if (function_exists('libiconv')) {
|
|
$conv = @libiconv('UTF-8', strtoupper($encoding), $string);
|
|
if ($conv) return $conv;
|
|
}
|
|
return $safe;
|
|
}
|
|
|
|
/**
|
|
* Special treatment for our guys in Redmond
|
|
* Windows-1252 is basically ISO-8859-1 -- with some exceptions, which get accounted for here
|
|
* @param string Your input in Win1252
|
|
* @param string The resulting ISO-8859-1 string
|
|
* @since 3.0.8
|
|
*/
|
|
function map_w1252_iso8859_1($string = '')
|
|
{
|
|
if ($string == '') return '';
|
|
$return = '';
|
|
for ($i = 0; $i < strlen($string); ++$i) {
|
|
$c = ord($string{$i});
|
|
switch ($c) {
|
|
case 129: $return .= chr(252); break;
|
|
case 132: $return .= chr(228); break;
|
|
case 142: $return .= chr(196); break;
|
|
case 148: $return .= chr(246); break;
|
|
case 153: $return .= chr(214); break;
|
|
case 154: $return .= chr(220); break;
|
|
case 225: $return .= chr(223); break;
|
|
default: $return .= chr($c); break;
|
|
}
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Special treatment for our guys in Redmond
|
|
* Windows-1252 is basically ISO-8859-1 -- with some exceptions, which get accounted for here
|
|
* @param string Your input in ISO-8859-1
|
|
* @param string The resulting Win1252 string
|
|
* @since 3.0.8
|
|
*/
|
|
function map_iso8859_1_w1252($string = '')
|
|
{
|
|
if ($string == '') return '';
|
|
$return = '';
|
|
for ($i = 0; $i < strlen($string); ++$i) {
|
|
$c = ord($string{$i});
|
|
switch ($c) {
|
|
case 196: $return .= chr(142); break;
|
|
case 214: $return .= chr(153); break;
|
|
case 220: $return .= chr(154); break;
|
|
case 223: $return .= chr(225); break;
|
|
case 228: $return .= chr(132); break;
|
|
case 246: $return .= chr(148); break;
|
|
case 252: $return .= chr(129); break;
|
|
default: $return .= chr($c); break;
|
|
}
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
?>
|