Тест при регистрации нового пользователя
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
-
biro
- phpBB 1.4.2
- Сообщения: 67
- Стаж: 15 лет 10 месяцев
- Откуда: Россия
- Благодарил (а): 12 раз
- Поблагодарили: 3 раза
Тест при регистрации нового пользователя
Скажите пожалуйста, есть ли какой-либо мод, который позволяет сделать обязательный тест (например на знание Правил Форума) при регистрации. Например, участнику нужно будет ответить на 5-7 вопросов, у каждого вопроса будет по 3 варианта ответа (один из них правильный).
Поиск на вашем форуме выдал мне только одну тему 2004 года в которой был всего один ответ с битой ссылкой.
Заранее спасибо.
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Тест при регистрации нового пользователя
За несколько лет боты не пробивались.
-
biro
- phpBB 1.4.2
- Сообщения: 67
- Стаж: 15 лет 10 месяцев
- Откуда: Россия
- Благодарил (а): 12 раз
- Поблагодарили: 3 раза
Re: Тест при регистрации нового пользователя
Вы про эту капчу?Sheer писал(а):Как работает, можешь посмотреть
или у вас дальше после регистрации идет тест?
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Тест при регистрации нового пользователя
Я в свое время поставил мод Connection Log и прикрутил к нему регистрацию, неудачные попытки записываются в лог - смотрю на него и умиляюсь, как боты бьются над этими тупыми вопросами.
-
biro
- phpBB 1.4.2
- Сообщения: 67
- Стаж: 15 лет 10 месяцев
- Откуда: Россия
- Благодарил (а): 12 раз
- Поблагодарили: 3 раза
Re: Тест при регистрации нового пользователя
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Тест при регистрации нового пользователя
- includes/functions.php
ucp/ucp_register.php
styles/ваш_стиль/template/ucp_register.html
language/ru/common.php
Найти
Код: Выделить всё
? > Код: Выделить всё
function question_select($default = '')
{
global $db;
$quest_options = '
<option value="-1">Вопрос</option>
<option value="-1">------------------</option>
<option value="1">Вопрос №1</option>
<option value="2">Вопрос №2</option>
<option value="3">Вопрос №3</option>
<option value="4">Вопрос №4</option>
<option value="5">Вопрос №5</option>
</select>';
return $quest_options;
}
function answer_select($default = '')
{
global $db;
$answ_options = '
<option value="-1">Ответ</option>
<option value="-1">------------------</option>
<option value="4">Ответ на вопрос №4</option>
<option value="3">Ответ на вопрос №3</option>
<option value="1">Ответ на вопрос №1</option>
<option value="5">Ответ на вопрос №5</option>
<option value="2">Ответ на вопрос №2</option></select>';
return $answ_options;
} Найти
Код: Выделить всё
'tz' => request_var('tz', (float) $timezone), Код: Выделить всё
// Anti bot
'quest' => request_var('quest', ''),
'answ' => request_var('answ', ''),
// Anti bot Код: Выделить всё
// Check and initialize some variables if needed
if ($submit)
{
$error = validate_data($data, array(
'username' => array( Код: Выделить всё
// Anti bot
$answ = request_var('answ', '');
// Anti bot Код: Выделить всё
'tz' => array('num', false, -14, 14), Код: Выделить всё
// Anti bot
'quest' => array('string', !$answ),
// Anti bot Код: Выделить всё
if ($data['email'] != $data['email_confirm'])
{
$error[] = $user->lang['NEW_EMAIL_ERROR'];
} Код: Выделить всё
// Anti bot
if ($data['quest'] == -1)
{
$error[] = $user->lang['AB_NO_QUESTION'];
}
else if ($answ == -1)
{
$error[] = $user->lang['AB_NO_ANSWER'];
}
else if ($data['quest'] != $answ)
{
$error[] = $user->lang['AB_QUESTION_ERROR'];
}
// Anti bot Код: Выделить всё
'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'), Код: Выделить всё
// Anti bot
'QUESTION' => question_select($data['quest']),
'ANSWER' => answer_select($data['answ']),
'L_AB_QUESTION_EXPLAIN' => $user->lang['AB_QUESTION_EXPLAIN'],
'L_AB_ANSWER_EXPLAIN' => $user->lang['AB_ANSWER_EXPLAIN'],
'L_AB_EXPLAIN' => $user->lang['AB_EXPLAIN'],
// Anti bot Найти
Код: Выделить всё
'ACCOUNT_ALREADY_ACTIVATED' => 'Ваша учётная запись уже была активирована.', Код: Выделить всё
'AB_QUESTION_EXPLAIN' => 'Вопрос',
'AB_ANSWER_EXPLAIN' => 'Ваш ответ',
'AB_EXPLAIN' => 'Для того, чтобы убедиться что вы не спам-бот, ответьте на один из вопросов',
'AB_QUESTION_ERROR' => 'Вы неправильно ответили на вопрос. Попробуйте еще раз.',
'AB_NO_ANSWER' => 'Вы не выбрали ответ',
'AB_NO_QUESTION' => 'Вы не выбрали вопрос', Найти
Код: Выделить всё
<td class="row2"><select name="tz">{S_TZ_OPTIONS}</select></td>
</tr>Код: Выделить всё
<tr>
<th colspan="2" valign="middle">{L_AB_EXPLAIN}</td>
</tr>
<tr>
<td class="row1"><span class="gensmall"><strong>{L_AB_QUESTION_EXPLAIN}</strong></span></td>
<td class="row2"><select name="quest">{QUESTION}</select>
* </td>
</tr>
<tr>
<td class="row1"><span class="gensmall"><strong>{L_AB_ANSWER_EXPLAIN}</strong></span></td>
<td class="row2"><select name="answ">{ANSWER}</select>
* </td>
</tr>Найти
Код: Выделить всё
<dd><select name="tz" id="tz" class="autowidth">{S_TZ_OPTIONS}</select></dd>
</dl>Код: Выделить всё
<dl><dd><strong>{L_AB_EXPLAIN}</strong><dd></dl>
<dl>
<dt class="row1"><span class="gensmall"><strong>{L_AB_QUESTION_EXPLAIN}</strong></span></dt>
<dd class="row2"><select name="quest">{QUESTION}</select> * </dd>
</dl>
<dl>
<dt class="row1"><span class="gensmall"><strong>{L_AB_ANSWER_EXPLAIN}</strong></span></dt>
<dd class="row2"><select name="answ">{ANSWER}</select> * </dd>
</dl> -
biro
- phpBB 1.4.2
- Сообщения: 67
- Стаж: 15 лет 10 месяцев
- Откуда: Россия
- Благодарил (а): 12 раз
- Поблагодарили: 3 раза
Re: Тест при регистрации нового пользователя
вот так: Как это можно сделать?
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Тест при регистрации нового пользователя
Так сгодится? Три (можно больше) случайные картинки из четырех (можно из большего количества - мне было лень рисовать) - четыре ответа на выбор. Необходимо определить все три фигуры.
-
biro
- phpBB 1.4.2
- Сообщения: 67
- Стаж: 15 лет 10 месяцев
- Откуда: Россия
- Благодарил (а): 12 раз
- Поблагодарили: 3 раза
Re: Тест при регистрации нового пользователя
Так как это делается?
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Тест при регистрации нового пользователя
TO DO
Код: Выделить всё
CREATE TABLE `phpbb_quest` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT ,
`field_0` TINYINT NOT NULL ,
`field_1` TINYINT NOT NULL ,
`field_2` TINYINT NOT NULL ,
`session_id` VARCHAR( 32 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
PRIMARY KEY ( `id` )
);Файл includes/constants.php
Найти
Код: Выделить всё
// Table names Код: Выделить всё
define('QUEST_TABLE', $table_prefix . 'quest'); Код: Выделить всё
<?php
/**
/**
* @ignore
*/
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
// Start session management
$user->session_begin();
$user->setup();
$session_id = ($user->data['session_id']);
$ar = array('pic_1', 'pic_2', 'pic_3','pic_4');
$answ = array('sqware', 'oval', 'treangl','round');
$form_name = array('answ1', 'answ2', 'answ3');
$submit = (isset($_POST['submit'])) ? true : false;
for ($i = 0; $i < 3; $i++)
{
$your[$i] = request_var($form_name[$i], '');
$field = 'field_';
if ($submit)
{
if ($your[$i] == -1)
{
$err = 1;
$sql = 'SELECT * FROM '.QUEST_TABLE.' WHERE session_id = ''.$session_id.''';
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if ($row)
{
$id = $row['id'];
}
else trigger_error('Ошибка в базе данных');
}
else
{
$field .= $i;
$sql = 'SELECT * FROM '.QUEST_TABLE.' WHERE session_id = ''.$session_id.''';
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if ($row)
{
$id = $row['id'];
$pole = $row[$field];
$ott = $answ[$your[$i]];
if ($answ[$pole] != $ott)
{
$err = 2;
}
}
else trigger_error('Ошибка в базе данных');
}
}
}
if ($submit)
{
$sql = 'DELETE FROM '.QUEST_TABLE.' WHERE id = '.$id.' AND session_id = ''.$session_id.''';
$result = $db->sql_query($sql);
if ($err == 1)
{
$error[] = 'Не был выбран один или более ответов';
}
else if ($err == 2)
{
$error[] = 'Был получен один или более неверных ответов';
}
if (!sizeof($error))
{
$sql = 'DELETE FROM '.QUEST_TABLE.' WHERE session_id = ''.$session_id.''';
$result = $db->sql_query($sql);
$message = 'Поздравляем! Вы прошли этот тест!';
trigger_error($message);
}
}
for ($cols = 0; $cols < 3; $cols++)
{
$a[$cols] = getUnqRand();
$quest = $ar[$a[$cols]];
$answer[$cols] = $answ[$a[$cols]];
$template->assign_block_vars('cols', array(
'PIC' => $quest,
'ANSW' => $answer[$cols],
'FORM_NAME' => $form_name[$cols],
));
}
$sql = 'INSERT INTO '.QUEST_TABLE.' (field_0, field_1, field_2, session_id) VALUES ('.$a[0].', '.$a[1].', '.$a[2].', ''.$session_id.'');';
$db->sql_query($sql);
$template->assign_vars(array(
'ANSWER' => answer_sel(),
'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
'COLS' => $i,
'MESSAGE' => 'Определите фигуру',
));
page_header('Test');
$template->set_filenames
(array
(
'body' => 'rnd.html'
)
);
page_footer();
function getUnqRand()
{
static $gens = array();
$min = 0;
$max = 3;
if (count($gens) < $max-$min) {
while (1) {
$new = rand(0, 3);
if (!in_array($new, $gens)) {
$gens[] = $new;
return $new;
}
}
}
return false;
}
function answer_sel($default = '')
{
$answ_options = '
<option value="-1">Ответ</option>
<option value="-1">------------------</option>
<option value="3">окружность</option>
<option value="2">треугольник</option>
<option value="0">квадрат</option>
<option value="1">овал</option>';
return $answ_options;
}
/*
CREATE TABLE `phpbb_quest` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT ,
`field_0` TINYINT NOT NULL ,
`field_1` TINYINT NOT NULL ,
`field_2` TINYINT NOT NULL ,
`session_id` VARCHAR( 32 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
PRIMARY KEY ( `id` )
);
*/
?>Код: Выделить всё
<!-- INCLUDE simple_header.html -->
<form method="post" action="{S_MODE_ACTION}">
<table class="tablebg" width="100%" cellspacing="1">
<tr><th colspan = {COLS}>{MESSAGE}</th></tr>
<!-- IF ERROR -->
<tr>
<td class="row3" colspan="{COLS}" align="center"><span class="error"><strong>{ERROR}</strong></span></td>
</tr>
<!-- ENDIF -->
<tr class="row1">
<!-- BEGIN cols -->
<td><div align="center"><img src="images/{cols.PIC}.png"><!-- <br>{cols.PIC} --></div></td>
<!-- END cols -->
</tr>
<tr class="row1">
<!-- BEGIN cols -->
<td>
<!-- {cols.ANSW}<br> -->
<select name="{cols.FORM_NAME}">{ANSWER}</select>
</td>
<!-- END cols -->
</tr>
</table>
<br><input type="submit" name="submit" value="{L_SUBMIT}" class="btnlite" />
<br />
</form>
<!-- INCLUDE simple_footer.html -->Всю эту схему можно перелопатить на свое усмотрения (вместо картинок вопрос, сделать вертикальную верстку и т.д.. Смогешь?
Добавлено спустя 7 минут 48 секунд:
ЗЫ. Кажись это надо объединить с этим [FAQ] Предотвращение спама в phpbb3
-
biro
- phpBB 1.4.2
- Сообщения: 67
- Стаж: 15 лет 10 месяцев
- Откуда: Россия
- Благодарил (а): 12 раз
- Поблагодарили: 3 раза
Re: Тест при регистрации нового пользователя
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Тест при регистрации нового пользователя
Ставим:
Файл language/ru/common.php
Найти
Код: Выделить всё
'ADMINISTRATOR' => 'Администратор', Код: Выделить всё
// Antibot start
'AB_COMMON_ERROR' => 'Данные не найдены, регистрация невозможна - обратитесь к %sадминистратору%s',
'AB_QUESTION_EXPLAIN' => 'Вопрос',
'AB_ANSWER_EXPLAIN' => 'Ваш ответ',
'AB_EXPLAIN' => 'Чтобы убедиться в том, что вы не спам-бот, ответьте на эти вопросы',
'AB_ANSWER_ERROR' => 'Был получен один или более неверных ответов. Попробуйте еще раз.',
'AB_QUESTION_ERROR' => 'Вы неправильно ответили на вопрос. Попробуйте еще раз.',
'AB_NO_QUESTION' => 'Не был выбран один или более вопросов. Попробуйте еще раз.',
// Antibot end Найти
Код: Выделить всё
define('ZEBRA_TABLE', $table_prefix . 'zebra'); Код: Выделить всё
// Antibot start
define('QUEST_TABLE', $table_prefix . 'antibot_questions');
define('ANSWER_TABLE', $table_prefix . 'antibot_answer');
// Antibot end Найти
Код: Выделить всё
$redirect = request_var('redirect', "{$phpbb_root_path}index.$phpEx"); Код: Выделить всё
// Start antibot
$i = 0;
$sql = 'SELECT * FROM '. ANSWER_TABLE .'';
$result = mysql_query($sql);
if ($result)
{
while( $row = $db->sql_fetchrow($result) ) $i++;
if($i)
{
$sql = 'TRUNCATE '. ANSWER_TABLE .'';
$result = $db->sql_query($sql);
}
}
// End Antibot Найти
Код: Выделить всё
'enable_confirm' => array('lang' => 'VISUAL_CONFIRM_REG', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), Код: Выделить всё
'enable_antibot' => array('lang' => 'ANTIBOT_REG', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'max_quest' => array('lang' => 'QUEST_LIMIT', 'validate' => 'int:0', 'type' => 'text:3:3', 'explain' => true), Найти
Код: Выделить всё
'USERNAME_LENGTH_EXPLAIN' => 'Минимальное и максимальное количество символов в именах пользователей.', Код: Выделить всё
'ANTIBOT_REG' => 'Задавать контрольные вопросы при регистрации',
'ANTIBOT_REG_EXPLAIN' => 'Для предотвращения автоматических регистраций новые пользователи при регистрации должны будут ответить на контрольные вопросы.',
'QUEST_LIMIT' => 'Количество контрольных вопросов на странице регистрации',
'QUEST_LIMIT_EXPLAIN' => 'Введите количество контрольных вопросов, отображаемых на станице регистрации (не менее 1 и не более 10).', Требуемые изменения не привожу, просто перепишете эти файлы из архива, что во вложении, поверху.
После заливки файлов наберите в браузере
Код: Выделить всё
http://домен/anti_bot.phpУкажите желаемое количество вопросов и впишите их
После установки вопросы можно редактировать/добавлять/удалять
Наберите в браузере
Код: Выделить всё
http://домен/antibot.phpКак видно, можно комбинировать текстовые и графические вопросы, просто вместо текста впишите
Код: Выделить всё
<img src="images/_имя_файла_">Тестируйте...
Во вложении исправленный вариант файла установки antibot_setup.php
-
biro
- phpBB 1.4.2
- Сообщения: 67
- Стаж: 15 лет 10 месяцев
- Откуда: Россия
- Благодарил (а): 12 раз
- Поблагодарили: 3 раза
Re: Тест при регистрации нового пользователя
И еще подскажите, пожалуйста, вот на странице установки мода можно задать вопрос и правильный ответ на него. А как добавить к каждому вопросу неправильные варианты ответа?
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Тест при регистрации нового пользователя
Короче в файле antibot_setup.php
Найти
Код: Выделить всё
$sql = "DROP TABLE IF EXISTS ". QUEST_TABLE .""; Код: Выделить всё
$sql = "DROP TABLE IF EXISTS ". ANSWER_TABLE ."";
$result = $db->sql_query($sql);
$sql = "CREATE TABLE ". ANSWER_TABLE ." (id int(4) NOT NULL AUTO_INCREMENT, quest varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, session_id varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, PRIMARY KEY (id)) ENGINE=MyISAM CHARSET utf8";
$result = $db->sql_query($sql);
Никак. И это уже слишком. Задай 11 вопросов и при регистрации спрашивай 5 вопросов. На каждый вопрос будет 11 вариантов ответов, среди них 4 будут неверные + 6 заведомо неправильных + "фиг его знает". Этого вполне предостаточно.biro писал(а): как добавить к каждому вопросу неправильные варианты ответа?
-
biro
- phpBB 1.4.2
- Сообщения: 67
- Стаж: 15 лет 10 месяцев
- Откуда: Россия
- Благодарил (а): 12 раз
- Поблагодарили: 3 раза
Re: Тест при регистрации нового пользователя
Можно как-то переделать ваш код, чтобы добавить неправильные ответы?

