Защита от клонов
-
- phpBB 1.0.0
- Сообщения: 4
- Стаж: 19 лет 4 месяца
Защита от клонов
Существует ли мод для защиты от клонов? Я имею ввиду когда регистрируется новый пользователь с именем уже имеющегося, заменив лишь одну английскую букву аналогом из русского алфавита (o - о, p - р и т.д.) При этом нужно оставить возможность регаться с русскими никами. И желательно не мучать БД перестраиванием ников во время установки мода. Может просто есть какие-то нароботки в этом плане? У мея была идея, но она требует замены во всех наках уже зарегистрированных пользователей русских букв на английские, если есть аналоги. (При этом пользователь будет иметь возможность залогинится введя любой из "синонимов" своего ника и свой пароль.)
ЗЫ: Извиняюсь если ответ на этот вопрос уже есть, но я его не смог найти.
ЗЫ: Извиняюсь если ответ на этот вопрос уже есть, но я его не смог найти.
-
- phpBB 2.0.1
- Сообщения: 297
- Стаж: 20 лет
VictorS, а вы не пробывали использовать встроенную функцию запрещённые имена?
Я вот свой ник (admin) защитил тем, что не нельзя региться с *admin* и *админ*
* - это означает что-либо..
А то зарегиться, какой-нибудь adminЛОХ - и что мне с ним делать?
Кроме как не удалить.
Я вот свой ник (admin) защитил тем, что не нельзя региться с *admin* и *админ*
* - это означает что-либо..
А то зарегиться, какой-нибудь adminЛОХ - и что мне с ним делать?

Терпение и труд - всё перетрут
Я на этом форуме уже чуть больше года.. спасибо вам за помощь!
Я на этом форуме уже чуть больше года.. спасибо вам за помощь!
-
- phpBB 1.0.0
- Сообщения: 4
- Стаж: 19 лет 4 месяца
IGO, это не то. В том-то и дело, что я на том форуме не админ, а просто очень активный пользователь, который поднадоел некоторым другим, и я первый столкнулся с проблемой своего клона. Конечно по кол-ву постов и id можно нас отличить, но многие купились на клона. После того как клон был разоблачен на форуме началась какая-то эпидемия. Администратор согласен поставить мод, если я предоставлю такой, но извращаться с запрещеными именами он не будет, т.к. придется вбивать их очень много.
Как я понимаю нету такого мода?
Как я понимаю нету такого мода?
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год 1 месяц
- Поблагодарили: 2 раза
Есть одна идея, вроде в целом правильная...
Берется ник регистрирующегося пользователя. Есть массив букв, одинаковых по внешнему виду. Заменой получаем все возможные варианты написания данного ника. Если хоть один из них уже зарегистрирован, такое имя запрещается к регистрации.
Например имеем ник admin. Первую букву можно заменить на русскую и таким образом получить другой по сути, но аналогичный визуально ник. Допустим, что человек так и сделал. Смотрим первую букву. Ага, ее можно поменять. Меняем на "эй". Ну и с остальными аналогично. Потом проверяем наличие ников.
Если идея правильная и кто-нибудь составит таблицу букв - напишу пожалуй...
Берется ник регистрирующегося пользователя. Есть массив букв, одинаковых по внешнему виду. Заменой получаем все возможные варианты написания данного ника. Если хоть один из них уже зарегистрирован, такое имя запрещается к регистрации.
Например имеем ник admin. Первую букву можно заменить на русскую и таким образом получить другой по сути, но аналогичный визуально ник. Допустим, что человек так и сделал. Смотрим первую букву. Ага, ее можно поменять. Меняем на "эй". Ну и с остальными аналогично. Потом проверяем наличие ников.
Если идея правильная и кто-нибудь составит таблицу букв - напишу пожалуй...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- Поддержка
- Сообщения: 5426
- Стаж: 20 лет 3 месяца
- Откуда: Питер
- Благодарил (а): 177 раз
- Поблагодарили: 749 раз
Xpert
Это как-то несложно решается через регулярные выражения.. в двух php-чатах (php.spb.ru и voodoo чат) есть такая функция, может как-то оттуда можно выдрать?
P.S. код функции могу выложить, если понадобится.
Это как-то несложно решается через регулярные выражения.. в двух php-чатах (php.spb.ru и voodoo чат) есть такая функция, может как-то оттуда можно выдрать?
P.S. код функции могу выложить, если понадобится.
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb2.0.x 3.5.x)
Ты очистил кеш? © Sheer
https://siava.ru (phpbb
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год 1 месяц
- Поблагодарили: 2 раза
Выложи, посмотрим...
Хотя обычно эту проблему решают в лоб - запрещают мешать русские и латинские буквы...
Хотя обычно эту проблему решают в лоб - запрещают мешать русские и латинские буквы...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- Поддержка
- Сообщения: 5426
- Стаж: 20 лет 3 месяца
- Откуда: Питер
- Благодарил (а): 177 раз
- Поблагодарили: 749 раз
Xpert
1. из voodoo чата:
2. из php.spb.ru:
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;
}
?>
Код: Выделить всё
//////////////////////////////////////////////////////////////////////////////
#
# Функции для проверки похожих ников (типа "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 (phpbb2.0.x 3.5.x)
Ты очистил кеш? © Sheer
https://siava.ru (phpbb
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год 1 месяц
- Поблагодарили: 2 раза
О чем я и говорил.Siava писал(а):В нике можно использовать либо только русские, либо только ". "английские буквы (но не их комбинацию). Кроме букв можно использовать ". "цифры и следующие символы
Voodoo Chat вообще меняет буквы ника на "аналогичные"...
Добавлено спустя 4 минуты 24 секунды:
Ну с win-1251 положим разберемся, а с utf-8?
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- phpBB 1.0.0
- Сообщения: 4
- Стаж: 19 лет 4 месяца
А ведь идея! Я и не подумал.Xpert писал(а):Выложи, посмотрим...
Хотя обычно эту проблему решают в лоб - запрещают мешать русские и латинские буквы...

А вот заменять буковки по одной и искать все варианты в БД, и только если они прошли проверку, то регать - это нагузка на БД и скорость работы скрипта. Например взять ник Terminator. 3 буквы можно менять: T, a и o. Итого 8 вариантов проверять.
Составить по введенному нику регулярное выражение можно. Хорошая идея.
Приведенные функции пока не посмотрел.
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год 1 месяц
- Поблагодарили: 2 раза
VictorS
Это самое решение в лоб мне и не нравится...
Можно попробовать воспользоваться возможностями MySQL по запросам с использованием регулярных выражений, т.е. например искать нечто похожее на (Т,T)(e,e)(r,г)mi(п,n)(a,а)t(о,o)(r,г). В скобках - варианты, некоторые по виду идентичны, некоторые - не совсем...
Это самое решение в лоб мне и не нравится...
Можно попробовать воспользоваться возможностями MySQL по запросам с использованием регулярных выражений, т.е. например искать нечто похожее на (Т,T)(e,e)(r,г)mi(п,n)(a,а)t(о,o)(r,г). В скобках - варианты, некоторые по виду идентичны, некоторые - не совсем...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- phpBB 1.0.0
- Сообщения: 4
- Стаж: 19 лет 4 месяца
В общем, я это сделал. 
В файл "include/functions.php" добавил:
В файле "functions_validate.php" немного подправил функцию validate_username:
1) Заменил:
на:
Ну как, ошибок на первый взгляд не видно?
Кстати, идея вынести массив $regex в языковой файл и оформить это дело как mod. Только подскажите как оформить мод.
P.S.: Всем спасибо за идеи.

В файл "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;
}
1) Заменил:
Код: Выделить всё
WHERE LOWER(username) = '" . strtolower($username) . "'";
Код: Выделить всё
WHERE username REGEXP '^" . convert_to_mask($username) . "$'";
Кстати, идея вынести массив $regex в языковой файл и оформить это дело как mod. Только подскажите как оформить мод.
P.S.: Всем спасибо за идеи.
-
- phpBB 2.0.15
- Сообщения: 1033
- Стаж: 20 лет 9 месяцев
- Откуда: Москва
- Благодарил (а): 207 раз
- Поблагодарили: 4 раза
Был реальный факт:Xpert писал(а):Есть одна идея, вроде в целом правильная...
Берется ник регистрирующегося пользователя. Есть массив букв, одинаковых по внешнему виду. Заменой получаем все возможные варианты написания данного ника. Если хоть один из них уже зарегистрирован, такое имя запрещается к регистрации.
Например имеем ник admin. Первую букву можно заменить на русскую и таким образом получить другой по сути, но аналогичный визуально ник. Допустим, что человек так и сделал. Смотрим первую букву. Ага, ее можно поменять. Меняем на "эй". Ну и с остальными аналогично. Потом проверяем наличие ников.
Если идея правильная и кто-нибудь составит таблицу букв - напишу пожалуй...
Существует Ник строчными буквами, другой сделал Ник аналогичный только БОЛЬШИМИ.
С уважением,
Сергей
Сергей
-
- phpBB 2.0.13
- Сообщения: 917
- Стаж: 19 лет 9 месяцев
- Откуда: с Луны свалил...
-
- Former team member
- Сообщения: 702
- Стаж: 20 лет 6 месяцев
-
- phpBB 1.4.4
- Сообщения: 199
- Стаж: 20 лет 3 месяца
- Откуда: Kiev.UA