Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2017-03-30 14:01:30

Evgen
Новичок
Зарегистрирован: 2017-03-30
Сообщений: 8

При регистрации обрезает имя пользователя до 3х символов.

Коллеги, добрый день!

Подскажите, как исправить и куда смотреть?
При регистрации нового пользователя, если написать имя Кирилицей (логин), то в базу сохраняется только первые три символа.
В файле register.php это поле
<input name="req_user" type="text" size="25" maxlength="25" value="">

На тестовом сервере всё работает нормально. Такая проблема замечена только на боевом. Раньше всё работало. Такая проблема возникла после переезда на другой хостинг.

Версия fluxbb 1.5.9

Версия PHP
На боевом 5.3.10
На тестовом 5.5.9

Offline

#2 2017-03-30 14:53:08

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

@Evgen, обновить версию php на боевом попробуйте. Если нет возможности выбрать более новую версию php, сверьте подключенные расширения php на тестовом и боевом.

Offline

#3 2017-03-30 16:10:12

Evgen
Новичок
Зарегистрирован: 2017-03-30
Сообщений: 8

Re: При регистрации обрезает имя пользователя до 3х символов.

@Visman, Обновить версию PHP на боевом не могу. Расширения с боевого и тестового серверов ниже.

Обрезанное имя пользователя возвращается уже в строке файла register.php, после этого уже в таким виде попадает в запрос к БД

	$username = pun_trim($_POST['req_user']);

Функция pun_trim() обявляется в файле forum/include/functions.php.
Она служит обёрткой для функции utf8_trim()

//
// A wrapper for utf8_trim for compatibility
//
function pun_trim($str, $charlist = false)
{
	return is_string($str) ? utf8_trim($str, $charlist) : '';
}

Функция utf8_trim() объявляется в файле forum/include/utf8/trim.php
Вот так выглядит объявление

function utf8_trim( $str, $charlist=false)
{
	if($charlist === false)
		return trim($str);

	return utf8_ltrim(utf8_rtrim($str, $charlist), $charlist);
}

Update:
Загруженные расширения на тестовом сервере.

Array
(
    [0] => Core
    [1] => date
    [2] => ereg
    [3] => libxml
    [4] => openssl
    [5] => pcre
    [6] => zlib
    [7] => bcmath
    [8] => bz2
    [9] => calendar
    [10] => ctype
    [11] => dba
    [12] => dom
    [13] => hash
    [14] => fileinfo
    [15] => filter
    [16] => ftp
    [17] => gettext
    [18] => SPL
    [19] => iconv
    [20] => mbstring
    [21] => session
    [22] => posix
    [23] => Reflection
    [24] => standard
    [25] => shmop
    [26] => SimpleXML
    [27] => soap
    [28] => sockets
    [29] => Phar
    [30] => exif
    [31] => sysvmsg
    [32] => sysvsem
    [33] => sysvshm
    [34] => tokenizer
    [35] => wddx
    [36] => xml
    [37] => xmlreader
    [38] => xmlwriter
    [39] => zip
    [40] => apache2handler
    [41] => PDO
    [42] => curl
    [43] => gd
    [44] => json
    [45] => mcrypt
    [46] => mysql
    [47] => mysqli
    [48] => pdo_mysql
    [49] => readline
    [50] => mhash
    [51] => Zend OPcache
)

Расширения на боевом

Array
(
    [0] => Core
    [1] => date
    [2] => ereg
    [3] => libxml
    [4] => openssl
    [5] => pcre
    [6] => zlib
    [7] => bcmath
    [8] => bz2
    [9] => calendar
    [10] => ctype
    [11] => dba
    [12] => dom
    [13] => hash
    [14] => fileinfo
    [15] => filter
    [16] => ftp
    [17] => gettext
    [18] => SPL
    [19] => iconv
    [20] => json
    [21] => mbstring
    [22] => session
    [23] => posix
    [24] => Reflection
    [25] => standard
    [26] => shmop
    [27] => SimpleXML
    [28] => soap
    [29] => sockets
    [30] => Phar
    [31] => exif
    [32] => sysvmsg
    [33] => sysvsem
    [34] => sysvshm
    [35] => tokenizer
    [36] => wddx
    [37] => xml
    [38] => xmlreader
    [39] => xmlwriter
    [40] => zip
    [41] => apache2handler
    [42] => gd
    [43] => mcrypt
    [44] => mysql
    [45] => mysqli
    [46] => PDO
    [47] => pdo_mysql
    [48] => mhash
)

Редактировался Evgen (2017-03-30 16:34:40)

Offline

#4 2017-03-30 16:40:51

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

Сделайте

var_dump($_POST['req_user']);

перед и после

$username = pun_trim($_POST['req_user']);

По поводу функции pun_trim. Она тут вызывается без второго параметра, то есть в дальнейшем используются стандартные функции php ltrim() и rtrim(), а не регулярные выражения.

Offline

#5 2017-03-30 16:48:30

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

В phpinfo еще гляньте версию PCRE Library. Может действительно библиотека регулярок очень старая стоит.

Offline

#6 2017-03-30 16:57:24

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

И еще вопрос: используете оригинальный FluxBB или мою сборку?

Offline

#7 2017-03-30 17:02:10

Evgen
Новичок
Зарегистрирован: 2017-03-30
Сообщений: 8

Re: При регистрации обрезает имя пользователя до 3х символов.

@Visman, Обрезанное значение ещё приходит до этой строки.

$username = pun_trim($_POST['req_user']);

Получается что это приходит из формы регистрации?

Update:
По поводу сборки не могу сказать, давно устанавливался форум. Как идентифицировать сборка ваша или нет?

Редактировался Evgen (2017-03-30 17:04:21)

Offline

#8 2017-03-30 17:07:14

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

@Evgen, получается что данные приходят в php уже обрезанные. Плагины безопасности на апаче смотрите. Сухосин например. Если есть, отключайте.

Offline

#9 2017-03-30 17:14:48

Evgen
Новичок
Зарегистрирован: 2017-03-30
Сообщений: 8

Re: При регистрации обрезает имя пользователя до 3х символов.

@Visman, список подключённых к apache плагинов
Тестовый

Array
(
    [0] => core
    [1] => mod_so
    [2] => mod_watchdog
    [3] => http_core
    [4] => mod_log_config
    [5] => mod_logio
    [6] => mod_version
    [7] => mod_unixd
    [8] => mod_access_compat
    [9] => mod_alias
    [10] => mod_auth_basic
    [11] => mod_authn_core
    [12] => mod_authn_file
    [13] => mod_authz_core
    [14] => mod_authz_host
    [15] => mod_authz_user
    [16] => mod_autoindex
    [17] => mod_deflate
    [18] => mod_dir
    [19] => mod_env
    [20] => mod_filter
    [21] => mod_mime
    [22] => prefork
    [23] => mod_negotiation
    [24] => mod_php5
    [25] => mod_rewrite
    [26] => mod_setenvif
    [27] => mod_status
)

Боевой

Array
(
    [0] => core
    [1] => mod_log_config
    [2] => mod_logio
    [3] => prefork
    [4] => http_core
    [5] => mod_so
    [6] => mod_alias
    [7] => mod_auth_basic
    [8] => mod_authn_file
    [9] => mod_authz_default
    [10] => mod_authz_groupfile
    [11] => mod_authz_host
    [12] => mod_authz_user
    [13] => mod_autoindex
    [14] => mod_cgi
    [15] => mod_deflate
    [16] => mod_dir
    [17] => mod_env
    [18] => mod_mime
    [19] => mod_negotiation
    [20] => mod_php5
    [21] => mod_reqtimeout
    [22] => mod_rewrite
    [23] => mod_rpaf-2
    [24] => mod_setenvif
    [25] => mod_status
)

Update:
Вот эти плагины есть только на боевом сервер. Сухосин не нашёл

    [9] => mod_authz_default
    [10] => mod_authz_groupfile
    [14] => mod_cgi
    [21] => mod_reqtimeout
    [23] => mod_rpaf-2

Редактировался Evgen (2017-03-30 17:23:26)

Offline

#10 2017-03-30 17:31:07

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

@Evgen, ни чего подозрительного тут.
Поставьте

var_dump($_POST['req_user']);

в самое начало файла регистрации (я про обработку входящих данных в common.php забыл) .

Offline

#11 2017-03-30 17:42:05

Evgen
Новичок
Зарегистрирован: 2017-03-30
Сообщений: 8

Re: При регистрации обрезает имя пользователя до 3х символов.

@Visman, Вставил в самую первую строчку register.php. Имя приходит корректное, не обрезанное.

var_dump($_POST['req_user']);

Вот здесь уже обрезенное имя

if (isset($_POST['form_sent']))
{var_dump($_POST['req_user']);

Редактировался Evgen (2017-03-30 17:42:19)

Offline

#12 2017-03-30 17:49:02

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

@Evgen, предлагаю попробовать заменить строку

	$array = utf8_bad_strip($array);

на

	mb_substitute_character(0xFFFD);
	$array = mb_convert_encoding((string) $array, 'UTF-8', 'UTF-8');

в файле functions.php и посмотреть на результат.

Offline

#13 2017-03-30 17:54:03

Evgen
Новичок
Зарегистрирован: 2017-03-30
Сообщений: 8

Re: При регистрации обрезает имя пользователя до 3х символов.

@Visman, Отлично! Сработало!  big_smile  Спасибо Вам большое.
Можете теперь пояснить, в чём была проблема этой строки? Ведь на тестовом всё работало.

$array = utf8_bad_strip($array);

И что делают ваши строчки?

	
mb_substitute_character(0xFFFD);
$array = mb_convert_encoding((string) $array, 'UTF-8', 'UTF-8');

Редактировался Evgen (2017-03-30 17:54:34)

Offline

#14 2017-03-30 18:02:37

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

@Evgen, это только тест. Верните последнее изменение на место. Нужно исправить функцию utf8_bad_strip().

mb_substitute_character(0xFFFD);

устанавливает символ замены для "плохих" символов.

$array = mb_convert_encoding((string) $array, 'UTF-8', 'UTF-8');

конвертирует содержимое $array из кодировки UTF-8 в кодировку UTF-8. При этом "плохие" символы заменяются на символ замены.

В файле include/utf8/utils/bad.php меняйте функцию

function utf8_bad_strip($original)
{
	return utf8_bad_replace($original, '');
}

на

function utf8_bad_strip($original)
{
	mb_substitute_character(0xFFFD);
	return mb_convert_encoding((string) $original, 'UTF-8', 'UTF-8');
}

чтобы в других местах, где данная функция используется не было ошибок.

Offline

#15 2017-03-30 18:11:10

Evgen
Новичок
Зарегистрирован: 2017-03-30
Сообщений: 8

Re: При регистрации обрезает имя пользователя до 3х символов.

@Visman, Сделал.
Работа функции utf8_bad_strip как-то зависит от настроек окружения?
Какие символы считаются плохие? И почему именно после трёх символов обрезались данные?
Не пойму.

Получается эта строка все "плохие символы" удаляла?

return utf8_bad_replace($original, '');
}

Offline

#16 2017-03-30 18:20:18

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: При регистрации обрезает имя пользователя до 3х символов.

@Evgen, зависит она только от функции utf8_bad_replace(), а та не зависит ни от чего, в ней нет ни каких заумных действий, только сравнения и конкатенация строк.

Какие символы считаются плохие?

Те которые не входят в диапазон символов UTF-8.

И почему именно после трёх символов обрезались данные?

Это тайна покрытая мраком smile

Получается эта строка все "плохие символы" удаляла?

Да, функция utf8_bad_replace() удаляет в данном случае все "плохие" символы. Я предложил вам ее заменить стандартной функцией mb_convert_encoding().

Offline

#17 2017-03-30 18:51:02

Evgen
Новичок
Зарегистрирован: 2017-03-30
Сообщений: 8

Re: При регистрации обрезает имя пользователя до 3х символов.

@Visman, Спасибо большое!

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens