Уже около полугода сижу на хостинге с UTF-8.
Почему? - просто бесплатные имеют ограничения, а платные с windows-1251 существенно дороже.
Форум работает выбрасывает иногда ошибки на шапкой, но в целом функциональность нормальная - все работает. И я бы даже забыл что форум работает на сервере с UTF-8, если бы не хакер, который начал вставлять в названия тем и сообщения различные коды.
Но все по-порядку:
-
С самого начала столкнулся с проблемой - кирилические ники и сообщения не отображаются, и я стал раскапывать почему.
Тут постоянно говорилось, что форум работает только на серверах с windows-1251.
Ппрописать в .htaccess эту строку:
CODE:
AddDefaultCharset windows-1251
- ничего не решает.
Эта строка регламентирует сервер передавать браузеру инфу в этой кодировке, и то, если не будет другой команды. На то, что передает браузер на сервер, это не распространяется.
Есть еще две директивы:
CODE:
CharsetSourceEnc windows-1251
- Загрузка файлов только в windows-1251
CODE:
CharsetDisable on
- Запрет перекодировать файлы.
Обе эти директивы вызывают у меня на хостинге - ошибку 500.
.htaccess ограничено в своей работе директивами заданными в httpd.conf
1. cooper - 14 октября 2015 — 14:21 - перейти к сообщению
2. cooper - 14 октября 2015 — 14:45 - перейти к сообщению
Как позднее оказалось проверка сообщений на вредоносный код не пропускают UTF-8. Поэтому отмена проверки разблокирует работу форума, но делает его уязвимым. В файле include/vars.class.php
было заменено на
CODE:
function Clean_Key($key) {
$key = trim($key);
if ($key == '') {
return '';
}
$key = preg_replace( "/\.\./" , '' , $key );
$key = preg_replace( "/\_\_(.+?)\_\_/" , '' , $key );
$key = preg_replace( "/^([\w\.\-\_]+)$/", "$1", $key );
return $key;
}
function Clean_Value($var) {
$var = (get_magic_quotes_gpc()) ? trim(stripslashes($var)):trim($var);
$var = preg_replace("#\r#","",$var);
return preg_replace("#&(\#[0-9]+;)#", "&$1", htmlspecialchars($var,ENT_QUOTES));
}
$key = trim($key);
if ($key == '') {
return '';
}
$key = preg_replace( "/\.\./" , '' , $key );
$key = preg_replace( "/\_\_(.+?)\_\_/" , '' , $key );
$key = preg_replace( "/^([\w\.\-\_]+)$/", "$1", $key );
return $key;
}
function Clean_Value($var) {
$var = (get_magic_quotes_gpc()) ? trim(stripslashes($var)):trim($var);
$var = preg_replace("#\r#","",$var);
return preg_replace("#&(\#[0-9]+;)#", "&$1", htmlspecialchars($var,ENT_QUOTES));
}
было заменено на
CODE:
function Clean_Key($key) {
if ($key == '') {
return '';
}
return $key;
}
function Clean_Value($var) {
return $var;
}
if ($key == '') {
return '';
}
return $key;
}
function Clean_Value($var) {
return $var;
}
3. cooper - 14 октября 2015 — 15:00 - перейти к сообщению
Поскольку для разблокирование работы форума на сервере с UTF-8 необходимо внести изменения лишь в один файл, то напрашивается вывод:
А не внести ли функцию перекодировки прямо этот файл?
В этом случае можно вернуть функцию проверки.
-
Но фокус в том, что этим уже занимались но не совсем удачно - функции перекодировки iconv нередко заблокированы через php.ini
Поэтому перекодировку лучше выполнить отдельным перекодировщиком:
Или ему подобным.
Может кто-то подскажет, как это сделать перед $key
А не внести ли функцию перекодировки прямо этот файл?
В этом случае можно вернуть функцию проверки.
-
Но фокус в том, что этим уже занимались но не совсем удачно - функции перекодировки iconv нередко заблокированы через php.ini
Поэтому перекодировку лучше выполнить отдельным перекодировщиком:
CODE:
<? function _charset_utf8_win($s)
{
$r='';
$state=1;
for ($i=0;$i<strlen($s);$i++) {="" $c="ord($s[$i]);" switch($state)="" case="" 1:="" not="" a="" special="" symbol="" if($c=""><=127)
{
$r.=$s[$i];
}
else
{
if(($c>>5)==6)
{
$c1=$c;
$state=2;
}
else
$r.=chr(128);
}
break;
case 2: //an utf-8 encoded symbol has been meet
$new_c2=($c1&3)*64+($c&63);
$new_c1=($c1>>2)&5;
$new_i=$new_c1*256+$new_c2;
switch($new_i)
{
case 1025: $out_c='Ё'; break;
case 1105: $out_c='ё'; break;
case 0x00ab: $out_c='«'; break;
case 0x00bb: $out_c='»'; break;
default: $out_c=chr($new_i-848);
}
$r.=$out_c;
$state=1;
break;
}
}
return $r;
} ?>
{
$r='';
$state=1;
for ($i=0;$i<strlen($s);$i++) {="" $c="ord($s[$i]);" switch($state)="" case="" 1:="" not="" a="" special="" symbol="" if($c=""><=127)
{
$r.=$s[$i];
}
else
{
if(($c>>5)==6)
{
$c1=$c;
$state=2;
}
else
$r.=chr(128);
}
break;
case 2: //an utf-8 encoded symbol has been meet
$new_c2=($c1&3)*64+($c&63);
$new_c1=($c1>>2)&5;
$new_i=$new_c1*256+$new_c2;
switch($new_i)
{
case 1025: $out_c='Ё'; break;
case 1105: $out_c='ё'; break;
case 0x00ab: $out_c='«'; break;
case 0x00bb: $out_c='»'; break;
default: $out_c=chr($new_i-848);
}
$r.=$out_c;
$state=1;
break;
}
}
return $r;
} ?>
Или ему подобным.
Может кто-то подскажет, как это сделать перед $key
4. cooper - 16 октября 2015 — 13:32 - перейти к сообщению
Скачал релиз на UTF-8 и сравнил include/vars.class.php - там точно такая же проверка ключей.
Почему же она пропускает кирилицу в UTF-8?
Ничего не понимаю.
-
Загрузил файлы из обоих релизов UTF-8 и windows-1251
Может кто чего подскажет.........................
Почему же она пропускает кирилицу в UTF-8?
Ничего не понимаю.
-
Загрузил файлы из обоих релизов UTF-8 и windows-1251
Может кто чего подскажет.........................