Вопрос при регистрации

Для многих движков есть модули цель которых не допустить автоматическую регистрацию. Решил сделать для LS, что-то подобное.

Юзер переходит на страницу регистрации. Вводит данные во все стандартные поля + в доп. поле вводит ответ на вопрос. Если ответ не совпадает с заданным в настройках, то говорим юзеру, что он ответил неправильно и аккаунт не регистрируем. Если правильно, то регистрируем :)

Поехали…

Открываем файл classes/actions/ActionRegistration.class.phpActionRegistration.class.php находим это:
			/**
			 * Проверка пароля
			 */
			if (!func_check(getRequest('password'),'password',5)) {
				$this->Message_AddError($this->Lang_Get('registration_password_error'),$this->Lang_Get('error'));
				$bError=true;
			} elseif (getRequest('password')!=getRequest('password_confirm')) {
				$this->Message_AddError($this->Lang_Get('registration_password_error_different'),$this->Lang_Get('error'));
				$bError=true;
			}



ниже добавляем это:
			/**
			 * Проверка ответа на вопрос
			 */
			if (!func_check(getRequest('question'),'mail')) {
				$reg_answer = REG_ANSWER;
				if (preg_match("/^{$reg_answer}$/iu", getRequest('question')) == false) {
					$this->Message_AddError(REG_ANSWER_ERROR,$this->Lang_Get('error'));
					$bError=true;
				}
			}



Открываем файл classes/modules/sys_viewer/Viewer.class.php находим это:

		$this->Assign("SITE_NAME",SITE_NAME);



ниже добавляем это:
		$this->Assign("REG_QUESTION",REG_QUESTION);



Открываем файл \templates\language\russian.php находим это:
	/**
	 * Регистрация
	 */



Ниже добавляем это:
	'registration_aquestion' => 'Ответьте на вопрос',



Редактируем дефолтный шаблон. Открываем файл templates/skin/new/actions/ActionRegistration/index.tpl и находим это:
			<label for="repass">{$aLang.registration_password_retry}:</label><br />
			<p><input type="password" class="input-text"  value="" id="repass" name="password_confirm"/></p><br />



Ниже добавляем это:

			<label for="question">{$aLang.registration_aquestion}</label><br />
			<span>{$REG_QUESTION}</span>
			<p><input type="text" class="input-text" name="question" id="question" value="{$_aRequest.question}"/></p><br />


Спасибо, chizpeople, за замечание.

В папке config/modules создаём папку reg_question и в ней файл config.php с таким содеражанием:

<?php
/**
 * Конфиг для хака "reg_question"
 */
define('REG_QUESTION','Ты человек? Отвечай чётко: <strong>да</strong> или <strong>нет</strong>.'); //Вопрос который будет задан при регистрации
define('REG_ANSWER','дА'); // Ответ на вопрос. При ответе не учитывается РеГисТр.
define('REG_ANSWER_ERROR','Обломись, дружище! Ты неправильно ответил на вопрос.'); //Сообщение о том, что юзер ответил на вопрос неправильно

?>

ВНИМАНИЕ! Файл должен быть сохранён в кодировке UTF-8.

PS: Этот текст редактируем под себя. То, что там написано просто для примера :)
PPS: Есть ещё кой какие идеи по доработке этого хака. Реализую когда будет свободное время.
PPPS: Программер из меня фиговейший. php я почти незнаю.
В последнее время все больше и больше играет роль продвижение сайта в интернете. Услуги по продвижению оказывают много различных компаний, то так же стоит обратить своей внимание на частного специалиста по продвижению сайта. Зачастую его услуги заметно дешевле, а качество не уступает крупным игрокам рынка.

36 комментариев

avatar
Есди было, что-то подобное, то извиняйте. Ненашёл.
avatar
1.Суть идеи в общем-то понятна. Только если спамер «нацелится» на конкретный сайт, то такой способ вряд ли спасёт. Вопросов всё равно будет конечное число, как собственно и ответов на них. Но всё равно эта штука пригодится, ибо в борьбе с автоматическими регистрациями самое главное это разнообразие методов противодействия «роботам».
2.Ой да ладно, не программист, php не знаю. Знаете! Если смогли разобраться в логике двига и написать этот хак, то знаете.

Благодарю за хак.
avatar
1. Да-да. Вернее будет написать просто защита от автоматической регистрации. Поправил.
2. Не-не-не. Не знаю. Ну ладно… Знаю но ооооочень слабо (основные конструкции, несколько ф-ций и немного регулярки). Что-то серьёзное мне не под силу. Хотя хочу заняться php более серьёзно. Ибо вёрстка стала надоедать :(
А смог разобраться потому, что код очень хорошо прокомментирован. Респект разработчику ;)
avatar
Ещё к п.1: я в pps говорил про идеи… Так вот в идеи входит реализация возможности указать несколько вопросов и ответов к ним и рандомно выводить при регистрации.
avatar
имхо это не спасет. конечное число вопрос в любом случае приведет к бруту. но за ман спасибо.
avatar
Эта метода, как один из вариантов — что бы невозможно было сайты «пачками» обходить. На каком-то это есть, на каком-то нет. Для спамеров затруднение сие представляет — по базе сайтов уже просто так не побегаешь. От спамера, который «на ручнике» регает вообще никакой скрипт не спасёт если регистрация свободная.
avatar
так я ведь и не спорю :) скажем задавать простейший вопрос при логине — не трудно для пользователя и трудно для бота.
но если при реге, любой более менее простейший бот это обойдет.
avatar
Я конкретно массовый «обход» однотипных сайтов, в смысле алгоритма регистрации, имел виду. А при использовании этого хака сайты уже не однотипные. Кто-то применит этот хак, а кто-то нет.
avatar
Я конечно в этом деле не особо прошарен, но если задать тематический вопрос без вариантов ответа, то, думаю, будет всё ок. Проверено на DLE и IPB. До установки подобного модуля было куча автоматических регистраций, а только ручные (в основном дети рекламят свои сайты на ucoz).

Отвечай чётко: да или нет

Это только в кач-ве примера. Можно задать тематический вопрос. не предлагать варианты ответа.
avatar
регистраций, а только ручные

заменить на:
регистраций, а после только ручные
avatar
Понятное дело, DLE и IPB двиги распространённые — лакомый кусочек для спамеров. Под распространённые спам ботов и пишут в первую очередь.
avatar
Ну, имхо, у LS есть все шансы стать таким же распространённым как DLE и ipb
avatar
А вот с этим утверждением я полностью соглашусь.
avatar
Кстати о идее. Можно поступить следующим образом: имя параметра (в котором передаётся ответ на вопрос) задавать случайным образом. Пусть программер, который будет писать бота, поломает малость свою лихую голову.
avatar
Спасибо. Поробую сделать, как следующий будет время.
avatar
А может заменить стандартную капчу на вашу?
avatar
А нужно ли?
Капча некого не напрягает. Это уже обычное дело. А вопрос как дополнительная мера.
avatar
вот собственно да. про капчу. просто нужно ее заменить
avatar
и все же, чтоб не было проблем с кодировкой, лучше придерживаться шаблона

\templates\skin\new\actions\ActionRegistration\index.tpl
<label for="question">{$aLang.registration_aquestion}:</label><br />
            <span class="input-areq">{$REG_QUESTION}</span>
            <p><input type="text" class="input-text" name="question" id="question" value="{$_aRequest.question}"/></p><br />


\templates\skin\new\css\style.css
.lite-center .input-areq { display: block; color: #888; font-size: 11px; line-height: 14px; }


\templates\language\russian.php
/**
	 * Регистрация
	 */
    'registration_aquestion' => 'Ответьте на вопрос',

avatar
А кто нибудь на ошибки тестил?

Вопрос: сколько букв в слове «сколько»? Ответ цифрой.
Правильный ответ естественно «7»

НО

Регистрация возможна если ввести 27, 37, 71, 77 и т.д. (т.е. лишние символы в ответе отбрасываются а нужные из ответа забираются)

Разьве это хорошо? :)
есть возможность это поправить как-то?
avatar
Спасибо. Буду править.
avatar
Поправил. Если ещё, что не так — пишите. ;)
avatar
Firefox 3.0.10 выдаёт в вопросе "������ ������� ������� ���������� ��" на странице регистрации…

замечание от Rash я учитывал…
avatar
Тот файл что содержит русские слова сохрани в кодировке UTF8 без BOM (без сигнатуры)
avatar
странно… после сохранения в UTF-8 без BOM появляется мессага об ошибке:

Warning: session_start() [function.session-start]: Cannot send session cache limiter — headers already sent (output started at N:\home\exhibition\www\config\modules\reg_question\config.php:1) in N:\home\exhibition\www\classes\modules\sys_session\Session.class.php on line 53

может это потому что сайт под денвером
avatar
у мну дважды кривые руки… :(
avatar
сорри, у меня руки кривые…
avatar
С вашего разрешение вношу некоторые изменения.
Что не понравилось — мне не понравилось, что вопрос как то выбивается из стиля оформления страницы регистрации.
Что получилось:


Как сделал:
В файле \templates\language\russian.php в блоке предложенном автором для вставки дополним этой строчкой:

	'registration_xaquestion' => 'Впишите фамилию Главы нашего славного города!',

После этого в файле templates/skin/new/actions/ActionRegistration/index.tpl предложенный автором блок меняем на представленный ниже

<label for="question">{$aLang.registration_aquestion}</label><br />
            <span>{$REG_QUESTION}</span>
            <p><input type="text" class="input-text" name="question" id="question" value="{$_aRequest.question}"/>
            <span class="input-note">{$aLang.registration_xaquestion}</span></p><br />


И последнее.
В блоке, который нужно сохранять в кодировке UTF-8 убираем сам вопрос и оставляем просто кавычки ''.

После этих изменений, мы не вываливаемся из общего дизайна страницы.
Сделал для себя. Поделился со всеми. На авторство не претендую.
avatar
Установил хак, протестировал, все работает. Только вот при ответе «нет» ничего не происходит, то есть нет самого ответа дефолтного «Обломись, дружище! Ты неправильно ответил на вопрос», а просто выдает ту же страницу регистрации для повторного ввода пароля, вопроса и капчи. В чем может быть дело?
avatar
Этот хак я делал достаточно давно. Возможно в системе, что-то поменялось…
К сожалению, сейчас заниматься этим хаком у меня нет времени.
avatar
Спасибо, всё работает!
avatar
Буду счастлив если кто нибудь переделает это в плагин. Готов даже заплатить.
avatar
Коллеги, а под какую версию LS этот хак?

У себя на 0.5.1 я не нашел файл сlasses/modules/sys_viewer/Viewer.class.php по этому адресу.

Видимо попал в какой-то спам лист — боты так прут и гадят. Поставил recaptcha на регистрацию. Накал упал, однако кое-кто все-таки продирается сквозь нее.

Думал, решу этим проблему…
  • CraSS
  • +1
avatar
Можно сделать тоже самое средствами js без изменения движка.
avatar
Наверно можно. Даже уверен, что можно. Но я вот, не программист ни разу. Поэтому, если бы Вы подсказали, как это сделать, то уверен, что это было бы полезно не только мне, но и всему сообществу LS.
avatar
Конечно.

Добавляете в /templates/skin/myskin/actions/ActionRegistration/index.tpl:
<input type='text' id='robotsCheck' placeholder='Вы робот?'>

И можете туда же, вверху
$(window).load(function(){
    $(id_формы_регистрации).submit(function(){
        robotVal = ('#robotsCheck').val();
        if(robotVal != 'Нет' || robotVal != 'нет') {
            alert('Неужели вы робот?');
            return false;
        }
    });
});


Это всего лишь набросок + эту систему легко обойти.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.