Защита от клонов

Идеи для расширения функциональности phpBB 2.0.x
VictorS
phpBB 1.0.0
Сообщения: 4
Стаж: 19 лет 4 месяца

Защита от клонов

Сообщение VictorS »

Существует ли мод для защиты от клонов? Я имею ввиду когда регистрируется новый пользователь с именем уже имеющегося, заменив лишь одну английскую букву аналогом из русского алфавита (o - о, p - р и т.д.) При этом нужно оставить возможность регаться с русскими никами. И желательно не мучать БД перестраиванием ников во время установки мода. Может просто есть какие-то нароботки в этом плане? У мея была идея, но она требует замены во всех наках уже зарегистрированных пользователей русских букв на английские, если есть аналоги. (При этом пользователь будет иметь возможность залогинится введя любой из "синонимов" своего ника и свой пароль.)

ЗЫ: Извиняюсь если ответ на этот вопрос уже есть, но я его не смог найти.
Аватара пользователя
IGO
phpBB 2.0.1
Сообщения: 297
Стаж: 20 лет

Сообщение IGO »

VictorS, а вы не пробывали использовать встроенную функцию запрещённые имена?
Я вот свой ник (admin) защитил тем, что не нельзя региться с *admin* и *админ*

* - это означает что-либо..

А то зарегиться, какой-нибудь adminЛОХ - и что мне с ним делать?
:? Кроме как не удалить.
Терпение и труд - всё перетрут
Я на этом форуме уже чуть больше года.. спасибо вам за помощь!
VictorS
phpBB 1.0.0
Сообщения: 4
Стаж: 19 лет 4 месяца

Сообщение VictorS »

IGO, это не то. В том-то и дело, что я на том форуме не админ, а просто очень активный пользователь, который поднадоел некоторым другим, и я первый столкнулся с проблемой своего клона. Конечно по кол-ву постов и id можно нас отличить, но многие купились на клона. После того как клон был разоблачен на форуме началась какая-то эпидемия. Администратор согласен поставить мод, если я предоставлю такой, но извращаться с запрещеными именами он не будет, т.к. придется вбивать их очень много.

Как я понимаю нету такого мода?
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

Есть одна идея, вроде в целом правильная...
Берется ник регистрирующегося пользователя. Есть массив букв, одинаковых по внешнему виду. Заменой получаем все возможные варианты написания данного ника. Если хоть один из них уже зарегистрирован, такое имя запрещается к регистрации.

Например имеем ник admin. Первую букву можно заменить на русскую и таким образом получить другой по сути, но аналогичный визуально ник. Допустим, что человек так и сделал. Смотрим первую букву. Ага, ее можно поменять. Меняем на "эй". Ну и с остальными аналогично. Потом проверяем наличие ников.

Если идея правильная и кто-нибудь составит таблицу букв - напишу пожалуй...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5426
Стаж: 20 лет 3 месяца
Откуда: Питер
Благодарил (а): 177 раз
Поблагодарили: 749 раз

Сообщение Siava »

Xpert
Это как-то несложно решается через регулярные выражения.. в двух php-чатах (php.spb.ru и voodoo чат) есть такая функция, может как-то оттуда можно выдрать?

P.S. код функции могу выложить, если понадобится.
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

Выложи, посмотрим...
Хотя обычно эту проблему решают в лоб - запрещают мешать русские и латинские буквы...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5426
Стаж: 20 лет 3 месяца
Откуда: Питер
Благодарил (а): 177 раз
Поблагодарили: 749 раз

Сообщение Siava »

Xpert
1. из voodoo чата:

Код: Выделить всё

<?php

//if you add your own to_canon_nick function, add the name into array
$to_canon_funcs = array("none","simplest","normal","umlauts","rus-win1251");

function to_canon_nick($nick){
        global $current_to_canon;
        switch($current_to_canon){
                case "none":                 break;
                case "simplest":         $nick = strtolower($nick);
                                                        break;
                case "normal":                 $nick = strtolower($nick);
                                                        strtr($nick,"016i","olbl");
                                                        break;
                case "umlauts":                $nick = strtolower($nick);
                                                        $nick = strtr($nick,"016i","olbl");
                                                        $umlauts = array("Я","д","ц","ь");
                                                        $umlauts2 = array("ss","ae","oe","ue");
                                                        $nick = str_replace($umlauts, $umlauts2, $nick);
                                                        break;
                case "rus-win1251":        $nick = strtolower($nick);
                                                        $nick = strtr($nick,"016абезикорсухьiнпмт","olbabe3ukopcyxblhnmt");
                                                        $nick = str_replace("ю","lo",$nick);
                                                        $nick = str_replace("ы","bl",$nick);
                                                        break;
        }
        return $nick;
}
?>
2. из php.spb.ru:

Код: Выделить всё

//////////////////////////////////////////////////////////////////////////////
#
#  Функции для проверки похожих ников (типа "DIMA" и "D1MA")
#
#     P.S. Если вы не на 100% владеете теорией рег. выражений, не редактируйте
#          ничего ниже. Последствия могут быть плачевными, вплодь до
#          remote PHP execution (http://php.spb.ru/regular_expression.html)
#
//////////////////////////////////////////////////////////////////////////////

   unset($reg);
   $reg['q']='q';
   $reg['w']='w';
   $reg['e']='[eеё]';
   $reg['r']='[rг]';
   $reg['t']='[tт]';
   $reg['y']='[yу]';
   $reg['u']='[uи]';
   $reg['i']='[i1l!]';
   $reg['o']='[oо0]';
   $reg['p']='[pр]';
   $reg['a']='[aа]';
   $reg['s']='[s5]';
   $reg['d']='d';
   $reg['f']='f';
   $reg['g']='[gд]';
   $reg['h']='[hн]';
   $reg['j']='j';
   $reg['k']='[kк]';
   $reg['l']='[l1i!]';
   $reg['z']='z';
   $reg['x']='[xх%]';
   $reg['c']='[cс]';
   $reg['v']='[vuи]';
   $reg['b']='[bвь]';
   $reg['n']='[nпл]';
   $reg['m']='[mм]';
   $reg['й']='[йиu]';
   $reg['ц']='ц';
   $reg['у']='[уy]';
   $reg['к']='[кk]';
   $reg['е']='[еeё]';
   $reg['н']='[нh]';
   $reg['г']='[гr]';
   $reg['ш']='[шwщ]';
   $reg['щ']='[щwш]';
   $reg['з']='[з3э]';
   $reg['х']='[хx%]';
   $reg['ъ']='[ъь]';
   $reg['ф']='ф';
   $reg['ы']='(ы|ь[i1l!]?)';
   $reg['в']='[вb]';
   $reg['а']='[аa]';
   $reg['п']='[пn]';
   $reg['р']='[рp]';
   $reg['о']='[оo0]';
   $reg['л']='[лn]';
   $reg['д']='д';
   $reg['ж']='ж';
   $reg['э']='[э3з]';
   $reg['я']='я';
   $reg['ч']='[ч4]';
   $reg['с']='[сc]';
   $reg['м']='[мm]';
   $reg['и']='[иuй]';
   $reg['т']='[тt]';
   $reg['ь']='[ьb]';
   $reg['б']='[б6]';
   $reg['ю']='(ю|[!1il][oо0])';
   $reg['ё']='[ёеe]';
   $reg['1']='[1il!]';
   $reg['2']='2';
   $reg['3']='[3зэ]';
   $reg['4']='[4ч]';
   $reg['5']='[5s]';
   $reg['6']='[6б]';
   $reg['7']='7';
   $reg['8']='8';
   $reg['9']='9';
   $reg['0']='[0оo]';
   $reg['_']='_';
   $reg['~']='[~^]';
   $reg['!']='[!1li]';
   $reg['@']='@';
   $reg['#']='#';
   $reg['$']='[$]';
   $reg['%']='[%x]';
   $reg['^']='[^~]';
   $reg['*']='[*]';
   $reg['(']='[(]';
   $reg[')']='[)]';
   $reg['=']='=';
   $reg['+']='[+]';
   $reg['.']='[.]';
   $reg['-']='-';


// проверка правильности ника: допустимые символы и длина
function pregchecknick ($nick) {
   // перл рег для проверки ника
   global $preg_check;

   if (!preg_match("/$preg_check/is",$nick))
      return "В нике можно использовать либо только русские, либо только ".
      "английские буквы (но не их комбинацию). Кроме букв можно использовать ".
      "цифры и следующие символы, ".
      "выделены синим цветом: \"".
      "<nobr><font color=blue size=+1><b><tt>_~!@^().-</tt></b></font></nobr>\". ".
      "Длина ника - от 2-х до 16 символов.";

   // защита от дураков, которые редактировали $preg_check и не сумели это
   // сделать правильно (а было написано не трогать):   /НИЖЕ ТОЖЕ НЕ ТРОГАТЬ/
   if (preg_match("![\n\r  :\"'&<>,]!",$nick)) err("Ошибка в алгоритме",__FILE__,__LINE__);

   return "ok";
}

function _pre_preg($nick) {
   global $reg;
   $n=sl($nick);
   $r="";
   for ($i=0; $i<strlen($nick); $i++) {
      if (!isset($reg[$n[$i]])) err("error# 10 - символ [$nick[$i]] не описан в \$reg",__FILE__,__LINE__);
      $r.=$reg[$n[$i]];
   }
   return "$r";
}

// поиск похожих ников в онлайне, в $thisnick вернут ник, на который был похож $nick
function onlinechecknick ($nick,&$thisnick) {
   global $reg,$user;
   $nick=sl($nick);
   $r='/^'._pre_preg($nick).'$/s';
   if (count($user)>0) {
      foreach ($user as $k=>$v) {
         $thisnick=$k;
         if (sl($k)==$nick) return "Данный ник уже занят. Человек с таким ником ".
            "сейчас находится в чате";
         //putlog($r);
         if (preg_match($r,sl($k))) return "В чате есть похожий ник, на ".
            "выбранный вами: <font color=blue><b>$k</b></font>. Он не точно ".
            "совпадает с вашим, а очень на него похож (он написан ".
            "в другой раскладке или просто похожими символами). ".
            "Если вам нужен именно этот ник, дождитесь, пока человек ".
            "с выбранным вами ником не покинет чат.";
      }
   }
   return "ok";
}

// поиск похожих ников в базе данных
function dbchecknick ($nick) {
   global $reg,$dbpath,$fnicklist;
   $r='/ '._pre_preg($nick).' /s';
   if (!file_exists($fnicklist)) return true;
   $f=fopen($fnicklist,"rb") or err("dbchecknick error# 1: не могу открыть $fnicklist для чтения",__FILE__,__LINE__);
   if (!flock2($f,6,0,0,0)) {
      return "К сожалению в данный момент сервер перегружен. ".
      "Из-за большого числа запросов на регистрацию ваша регистрация отложена. ".
      "Нажмите на кнопку (ниже) и вы вернетесь назад к вашей форме. ".
      "Через 2-5 секунд повторите ваш запрос. Если вы постоянно видите это сообщение, ".
      "то это ошибка блокировки файлов (файл __other.php строка ".__LINE__.").";
   }
   $buf=" ".fread($f,filesize($fnicklist))." ";
   $tmp=preg_match($r,$buf);
   fclose($f);
   if ($tmp) return
      "В базе данных уже зарегистрирован человек с ником, похожим на указанный вами:".
      " <u><font color=blue><b>$nick</b></font></u>. Возможно, он написан ".
      "в другой раскладке или просто похожими символами. ".
      "Регистрация похожих ников не допускается. Если это ваш ник, ".
      "но вы забыли пароль, смотрите страницу '<a href='login.php?c=forget'>".
      "забыл пароль</a>'.<p>Если вам хочется взять именно этот ник, ".
      "то вы можете только входить в чат (без регистрации и/или пароля). ".
      "Только помните, что если в чат войдет зарегистрированный ".
      "пользователь с оригинальным ником (<u>$nick</u>), то вы будете немедленно ".
      "отключены, т.к. похожие ники недопускаются.";
   return "ok";
}
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

Siava писал(а):В нике можно использовать либо только русские, либо только ". "английские буквы (но не их комбинацию). Кроме букв можно использовать ". "цифры и следующие символы
О чем я и говорил.
Voodoo Chat вообще меняет буквы ника на "аналогичные"...

Добавлено спустя 4 минуты 24 секунды:

Ну с win-1251 положим разберемся, а с utf-8?
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
VictorS
phpBB 1.0.0
Сообщения: 4
Стаж: 19 лет 4 месяца

Сообщение VictorS »

Xpert писал(а):Выложи, посмотрим...
Хотя обычно эту проблему решают в лоб - запрещают мешать русские и латинские буквы...
А ведь идея! Я и не подумал. :oops:

А вот заменять буковки по одной и искать все варианты в БД, и только если они прошли проверку, то регать - это нагузка на БД и скорость работы скрипта. Например взять ник Terminator. 3 буквы можно менять: T, a и o. Итого 8 вариантов проверять.

Составить по введенному нику регулярное выражение можно. Хорошая идея.

Приведенные функции пока не посмотрел.
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

VictorS
Это самое решение в лоб мне и не нравится...
Можно попробовать воспользоваться возможностями MySQL по запросам с использованием регулярных выражений, т.е. например искать нечто похожее на (Т,T)(e,e)(r,г)mi(п,n)(a,а)t(о,o)(r,г). В скобках - варианты, некоторые по виду идентичны, некоторые - не совсем...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
VictorS
phpBB 1.0.0
Сообщения: 4
Стаж: 19 лет 4 месяца

Сообщение VictorS »

В общем, я это сделал. :)
В файл "include/functions.php" добавил:

Код: Выделить всё

function convert_to_mask($str)
{
    $regex = array('[АA]', '[аa]', '[б6]', '[ВB]', '[гr]', '[ЕE]', '[еe]',
                   '[Зз3]', '[КK]', '[кk]', '[МM]', '[НH]', '[ОO0]', '[оo]',
                   '[пn]', '[РP]', '[рp]', '[СC]', '[сс]', '[ТT]', '[уy]',
                   '[ХX]', '[хx]', '[Ьb]');
    $str = str_replace('-', '\-', $str);
    for ($i = 0; $i < count($regex); $i++)
        $str = preg_replace('/'.$regex[$i].'/', $regex[$i], $str);
    return $str;
}
В файле "functions_validate.php" немного подправил функцию validate_username:
1) Заменил:

Код: Выделить всё

WHERE LOWER(username) = '" . strtolower($username) . "'";
на:

Код: Выделить всё

WHERE username REGEXP '^" . convert_to_mask($username) . "$'";
Ну как, ошибок на первый взгляд не видно?
Кстати, идея вынести массив $regex в языковой файл и оформить это дело как mod. Только подскажите как оформить мод.

P.S.: Всем спасибо за идеи.
Erlang
phpBB 2.0.15
Сообщения: 1033
Стаж: 20 лет 9 месяцев
Откуда: Москва
Благодарил (а): 207 раз
Поблагодарили: 4 раза

Сообщение Erlang »

Xpert писал(а):Есть одна идея, вроде в целом правильная...
Берется ник регистрирующегося пользователя. Есть массив букв, одинаковых по внешнему виду. Заменой получаем все возможные варианты написания данного ника. Если хоть один из них уже зарегистрирован, такое имя запрещается к регистрации.

Например имеем ник admin. Первую букву можно заменить на русскую и таким образом получить другой по сути, но аналогичный визуально ник. Допустим, что человек так и сделал. Смотрим первую букву. Ага, ее можно поменять. Меняем на "эй". Ну и с остальными аналогично. Потом проверяем наличие ников.

Если идея правильная и кто-нибудь составит таблицу букв - напишу пожалуй...
Был реальный факт:
Существует Ник строчными буквами, другой сделал Ник аналогичный только БОЛЬШИМИ.
С уважением,
Сергей
Аватара пользователя
edgar
phpBB 2.0.13
Сообщения: 917
Стаж: 19 лет 9 месяцев
Откуда: с Луны свалил...

Сообщение edgar »

VictorS писал(а):В общем, я это сделал.
Дайте адрес сайта. Там сегодня же будет клон! Готов поспорить на 100 рублей.

Добавлено спустя 32 секунды:

:D 8)
Kastaneda
Former team member
Сообщения: 702
Стаж: 20 лет 6 месяцев

Сообщение Kastaneda »

Erlang писал(а):Существует Ник строчными буквами, другой сделал Ник аналогичный только БОЛЬШИМИ.
На PostgreSQL?
Аватара пользователя
AlexWB
phpBB 1.4.4
Сообщения: 199
Стаж: 20 лет 3 месяца
Откуда: Kiev.UA

Сообщение AlexWB »

Kastaneda дело не в PostgreSQL а методе сравнения, если SQL настроен на игнорирование регистра при поиске (что, ИМХО, правильно на форуме), то такая ситуация исключается

Вернуться в «Запросы модов для phpBB 2.0.x»