Перейти к содержимому


Фотография

Одновременное наличие латинских и русских букв в логине при регистраци

Форумы IBResource

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 6
malik
  • Клиенты
  • Cообщений: 88

Отправлено

Как правильнее сделать проверку на одновременное наличие латинских и русских букв в логине при регистрации? Это нужно во избежание регистрации ников с визуально похожими буквами разных алфавитов.

Если можно сделать хуком, то подскажите где можно почитать про их написание.

 

Можно, конечно, внести правки прямо в скрипт, но как-то это некрасиво. Хотя нужное место я уже вроде нашёл - файл admin/applications/core/modules_public/global/register.php где-нибудь в начале функции registerForm.

 

Спасибо.



FatCat
  • Клиенты
  • Cообщений: 3 349
  • http://pharm-forum.ru
  • Город:Москва

Отправлено

Как правильнее сделать проверку на одновременное наличие латинских и русских букв в логине при регистрации? Это нужно во избежание регистрации ников с визуально похожими буквами разных алфавитов.

Делал у себя подобное, только не при регистрации, а отображение на форуме:

- сначала str_replace удаляются все английские буквы и разрешенные спецсимволы;

- затем сравнивается исходный ник и что получилось: если строка не пустая и отличается от исходной, значит есть смешение;

- дальше неанглийские буквы красятся в зеленый цвет.

 

16320772.gif



Denis Chursinov
  • Клиенты
  • Cообщений: 653

Отправлено

Я когда-то делал что-то вроде таблиц транслитерации, приводил имена к стандартному виду и сравнивал с имеющимися.

Патчить надо файл admin\sources\classes\member\memberFunctions.php в районе 700 строки, искать по словам // Blocking certain chars in username? .  Там проверяются имена на соответствие регулярке из настроек. Можно просто пихнуть 2 регулярки preg_match('/[a-Z]/i'... и [а-Я] . Если обе положительные, то слать лесом. 

По поводу лучшего пути, через месяц 3.х станет официально неподдерживаемой устаревшей версией. Больше никаких патчей и обновлений от разработчиков не будет. Поэтому смысл заморачиваться с оборачиванием хуков есть только, чтобы включать и отключать их потом в админке или если надо тиражировать изменения на 10 форумов. Можно уже выгрузить весь код в личный гитлаб и править все, что захочется, не забывая вставлять комментарии и синхронизировать репозиторий.



malik
  • Клиенты
  • Cообщений: 88

Отправлено

Спасибо за развёрнутый ответ. Раз скоро патчи и обновы перестанут выпускать, то проще прям в коде дописать.

 

А ещё вопрос не совсем по теме. В версии 2 можно было написать свой модуль и обращаться к нему прямо через УРЛ (например - мой_сайт/index.php?act=module&module=my-module), а в версии 3 модулей не нашёл. Как теперь реализовывать дополнительный функционал, напрямую не используемый в работе форума, с возможностью прямого обращения к нему? Например, у меня были модули для съёма статистики по юзерам и гостям онлайн, для обзора активности модераторов и т.п.



Denis Chursinov
  • Клиенты
  • Cообщений: 653

Отправлено

В url есть app - приложение, module - модуль и section - секция . В папке форума это будет в папке приложения директория modules_public для публичной части и modules_admin для админской. Внутри нее папка с названием модуля, а в нем уже файл с названием секции. Проще всего добавить секцию в существующий модуль. Там будет все уже проинициализировано родительским классом:

                $this->registry   =  $registry;
		$this->DB         =  $this->registry->DB();
		$this->settings   =& $this->registry->fetchSettings();
		$this->request    =& $this->registry->fetchRequest();
		$this->lang       =  $this->registry->getClass('class_localization');
		$this->member     =  $this->registry->member();
		$this->memberData =& $this->registry->member()->fetchMemberData();
		$this->cache      =  $this->registry->cache();
		$this->caches     =& $this->registry->cache()->fetchCaches();		
		$this->memberData = IPSMember::setUpModerator( $this->memberData );

Просто берете шапку из любой другой секции. В названии класса меняете последний кусок на свою секцию(совпадает с именем файла). И переписываете функцию doExecute .

Если скрипт не собирается все инициализировать по полной, то  можно его вообще куда угодно положить и обратиться браузером. Начало у него будет такое:
 

<?php

define( 'IPS_IS_SHELL', true );
define( 'IPB_THIS_SCRIPT', 'public' );
require_once( './initdata.php' );
require_once( IPS_ROOT_PATH . 'setup/sources/base/ipsRegistry_setup.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'setup/sources/base/ipsController_setup.php' );/*noLibHook*/

$registry = ipsRegistry::instance();
$registry->init();
$request = $registry->fetchRequest();

Это для корневой папки. Если куда-то класть еще, то надо просто прописать путь к initdata.php . Registry и Controller подключаются те, которые в модуле установки, это позволяет обойти некоторые ошибки и не инициализировать лишнее. Но такое начало позволяет пользоваться всеми встроенными функциями и настройками. Методы работы с базой, например, можно запускать через $registry->DB()



malik
  • Клиенты
  • Cообщений: 88

Отправлено

Спасибо, вроде получается.



malik
  • Клиенты
  • Cообщений: 88

Отправлено

Получилось вроде, надо проверить на живых людях )

 

Патчить надо файл admin\sources\classes\member\memberFunctions.php в районе 700 строки, искать по словам // Blocking certain chars in username? .  Там проверяются имена на соответствие регулярке из настроек. Можно просто пихнуть 2 регулярки preg_match('/[a-Z]/i'... и [а-Я] . Если обе положительные, то слать лесом. 

 

Добавил в настройки "Ограничения пользовательских имен" пункт с названием "Сообщение об ошибке при наличии русских и английских букв в имени", ключом "username_error_rueng" и текущим значением "Имя не может содержать одновременно русские и английские буквы!".

 

Дописал после указанного вами блока, начинающегося со строки "// Blocking certain chars in username?", вот такой блок:

 if( ipsRegistry::$settings['username_error_rueng'] )
 {
         if( preg_match("/[a-z]/i", $_name) && preg_match("/[а-я]/i", $_name) )
         {
                 return array( 'name' => $original, 'errors' => array( ipsRegistry::$settings['username_error_rueng'] ) );
         }
 }

Работает нормально, за исключением буквы "ё", она не попадает в диапазон "а-я". С учётом того, что и вообще форум как-то по-особенному воспринимает эту букву в именах пользователей (вероятно где-то в коде это специально описано) я решил, что лучше вообще запретить её использование в именах.

 






Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных