FouRoom.RU: Креативное общение
title
Description
Body
Многих волнует вопрос: как ставить хорошую капчу для "гостя" - чтобы от спамеров избавиться!
Есть пара стандартных модов на http://punres.org, но они сильно простенькие, и их запросто "щелкнет" продвинутый спам-бот. Хорошая капча есть тут: http://captcha.ru/
там представлен код, а так же сравнение разных алгоритмов:
http://captcha.ru/captchas/
http://captcha.ru/kcaptcha/
http://captcha.ru/articles/algorithm/
вот прямая ссылка на исходник: http://captcha.ru/kcaptcha.zip
Благодаря уважаемому админу ресурса http://punbb.ru, товарищу hcs, мы можем приспособить эту самую эффективную капчу и для punbb-форума (что кстате и сделано в сборке от hcs).
Но политика http://fouroom.ru предполагает что в большинство вопросов человек должен иметь возможность написать сообщение и не проходя процедуру регистрации. Поэтом мне необходимо было добавить капчу не только в форму регистрации, но и в форму ответа для "гостя".
вот как я это сделал:
--- в post.php:
перед
define('PUN_ROOT', './');вставить
session_start();
после:
// Otherwise it should be in $_POST
else
{добавить
// IMAGE VERIFICATION MOD BEGIN
// Image verifcation
if ($pun_config['o_regs_verify_image'] == '1')
{
// Make sure what they submitted is not empty
if (trim($_POST['req_image']) == '') {
unset($_SESSION['captcha_keystring']);
$errors[] = $lang_post['Text mismatch'];
// message($lang_post['Text mismatch']);
}
if($_SESSION['captcha_keystring'] != strtolower(trim($_POST['req_image']))) {
unset($_SESSION['captcha_keystring']);
$errors[] = $lang_post['Text mismatch'];
// message($lang_post['Text mismatch']);
}
if(!isset($_SESSION['captcha_keystring'])){
unset($_SESSION['captcha_keystring']);
$errors[] = $lang_post['Text mismatch2'];
// message($lang_common['Bad request']);
}
unset($_SESSION['captcha_keystring']);
}
// IMAGE VERIFICATION MOD ENDзатем надо вставить саму капчу в форму ответа. у меня это после:
?> <label class="conl"><strong><?php echo $lang_post['Guest name'] ?></strong><br /><input type="text" name="req_username" value="<?php if (isset($_POST['req_username'])) echo pun_htmlspecialchars($username); ?>" size="25" maxlength="25" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
<label class="conl"><?php echo $email_label ?><br /><input type="text" name="<?php echo $email_form_name ?>" value="<?php if (isset($_POST[$email_form_name])) echo pun_htmlspecialchars($email); ?>" size="50" maxlength="50" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
<div class="clearer"></div>добавить
<?php
// IMAGE VERIFICATION MOD BEGIN
if ($pun_config['o_regs_verify_image'] == '1'): ?>
<div class="inform">
<div class="infldset">
<label id="gray"><img style="border: 1px solid #aaa;" src="<?php echo $pun_config['o_base_url']?>/include/captcha/captcha.php?<?php echo session_name()?>=<?php echo session_id()?>"> <strong><?php echo $lang_post['Image text'] ?></strong> <input type="text" name="req_image" size="16" maxlength="16" /></label>
</div>
</div>
<?php endif;
// IMAGE VERIFICATION MOD END
?>ну и под финиш надо определиться с undefined-полями. Дело в том что в оригинальной версии punbb (http://punbb.org) есть имя только у поля "имя" гостя. поэтому если не заполнить другое поле (например е-майл) - браузер выдаст ошибку "незаполнено undefined-поле". Если правильно назвать поля- он будет говорить какое именно поле не заполнено. делаем это так:
гдето на уровне 400-й строки, это:
$required_fields['req_username'] = $lang_post['Guest name'];
меняем на это:
$required_fields = array('req_email' => $lang_common['E-mail'], 'req_subject' => $lang_common['Subject'], 'req_message' => $lang_common['Message'], 'req_username' => $lang_post['Guest name'], 'req_image' => $lang_post['Imgtxt']);ну или если у Вас сборка rev.85 с http://punbb.ru, то строка которую надо заменить будет более полная:
$required_fields = array('req_email' => $lang_common['E-mail'], 'req_subject' => $lang_common['Subject'], 'req_message' => $lang_common['Message'], 'req_username' => $lang_post['Guest name']);но всё же там не хватает имени поля, которое мы только что добавили!, поэтому в конец туда добавляем (перед скобкой):
, 'req_image' => $lang_post['Imgtxt']
или просто заменить строчку на эту:
$required_fields = array('req_email' => $lang_common['E-mail'], 'req_subject' => $lang_common['Subject'], 'req_message' => $lang_common['Message'], 'req_username' => $lang_post['Guest name'], 'req_image' => $lang_post['Imgtxt']);так. теперь у нас рабочий post.php, но надо ещё языковые константы добвить.
добавлять будем в папку /lang/... язык.../post.php
причём сколько языков, столько и добавляем.
я лично добавлял так:
в lang/russian/post.php:
(добавлять надо после запятой или в конец или между двумя любыми элементами массива)
//Image Verification stuff //'Image verification' => 'Введите правильный текст с картинки', 'Imgtxt' => 'Текст с картинки', 'Image text' => 'Введите текст с картинки:', // 'Текст', //'Image info' => 'Введите текст, который Вы видите на картинке. Это необходимо для защиты от спам-ботов, извините за неудобство.', 'Text mismatch' => 'Введённый Вами текст не совпадает с картинкой', 'Text mismatch2' => 'Попробуйте правильно ввести текст. Не обновиляйте страницу<br /> Но: если в Вашем браузере отключены картинки и вы открыли эту страницу, сперва включите картинки, затем обновите её.<span style="color: #aa0000"> При обновлении текст потеряется, поэтому скопируйте его в буфер обмена!</span>',
в lang/english/post.php:
(добавлять надо после запятой или в конец или между двумя любыми элементами массива)
//Image Verification stuff //'Image verification' => 'Image Verification', 'Imgtxt' => 'Text from image', 'Image text' => 'Input text from image to text box', //'Image Text', //'Image info' => 'Please copy the text in the image to the text box above', 'Text mismatch' => 'Please make sure the text and the image match', 'Text mismatch2' => 'Try again input the text from image. Don\'t reload page<br /> but: if your browser not show images, and you open this page, first turn on images-show, after reload this page.<span style="color: #aa0000"> If you reloaded page, text in message area will be lost, then copy it\'s to copy-buffer!</span>',
теперь всё это надо закачать на сервер в правильные места.
Сами файлы капчи в прикреплённом файле. у меня они лежат в папке:
include/captcha/
поэтому их туда и распаковывайте (только чтобы не получилось include/captcha/captcha - смотрите)
Неактивен(а)
А теперь для тех кто не хочет пользоваться основной сборкой http://punbb.ru:
полделайте все вышеописанные изменения, но плюс к тому - еще надо добавить код капчи в register.php и языковые константы для него.
итак, в register.php добавляем перед:
define('PUN_ROOT', './');это:
session_start();
затем после:
if ($db->num_rows($result))
message('За последние 10 минут с вашего IP уже регистрировался новый пользователь. Для предотвращения флуд-регистрации, с одного и того же IP можно регистрировать пользователя не чаще чем раз в 10 минут. Простите за неудобство.');(тут у вас другая строка, да ещё и по аглицки, если конечно вы не пользуетесь моеё сборкой. а иначе вам эта тема не актуальна- я там уже свё сделал)
добавляем:
// IMAGE VERIFICATION MOD BEGIN
// Image verifcation
if ($pun_config['o_regs_verify_image'] == '1')
{
// Make sure what they submitted is not empty
if (trim($_POST['req_image']) == '') {
unset($_SESSION['captcha_keystring']);
message($lang_register['Text mismatch']);
}
// Каптча содержит только латиницу. Она работает. Золотое правило -
// Если это работает, то не трогай это! :-)
if($_SESSION['captcha_keystring'] != strtolower(trim($_POST['req_image']))) {
unset($_SESSION['captcha_keystring']);
message($lang_register['Text mismatch']);
}
if(!isset($_SESSION['captcha_keystring'])){
unset($_SESSION['captcha_keystring']);
message($lang_common['Bad request']);
}
unset($_SESSION['captcha_keystring']);
}
// IMAGE VERIFICATION MOD ENDпотом после:
<p class="clearb"><?php echo $lang_register['Pass info'] ?></p>
</div>
</fieldset>
</div>
<?php endif; ?> <div class="inform">добавляем:
<?php
// IMAGE VERIFICATION MOD BEGIN
if ($pun_config['o_regs_verify_image'] == '1'): ?>
<div class="inform">
<fieldset>
<legend><?php echo $lang_register['Image verification'] ?></legend>
<div class="infldset">
<img id="capchaimg" src="<?php echo $pun_config['o_base_url']?>/include/captcha/captcha.php?<?php echo session_name()?>=<?php echo session_id()?>"><br />
<label class="conl"><strong><?php echo $lang_register['Image text'] ?></strong><br /><input type="text" name="req_image" size="16" maxlength="16" /><br /></label>
<p class="clearb"><?php echo $lang_register['Image info'] ?></p>
</div>
</fieldset>
</div>
<?php endif;
// IMAGE VERIFICATION MOD END
?>теперь идём в /lang/Russian/register.php
и там, по аналогии с прослым сообщением, добавляем:
//Image Verification stuff 'Image verification' => 'Введите правильный текст с картинки', 'Image text' => 'Текст', 'Image info' => 'Введите текст, который Вы видите на картинке. Это необходимо для защиты от регистрации спам-ботов, извините за неудобство.', 'Text mismatch' => 'Введённый Вами текст не совпадает с картинкой',
теперь идём в /lang/English/register.php
и там, по аналогии с прослым сообщением, добавляем:
//Image Verification stuff 'Image verification' => 'Input text from image', 'Image text' => 'Image Text', 'Image info' => 'Please copy the text in the image to the text box above', 'Text mismatch' => 'Please make sure the text and the image match',
учтите что и русский и английский переводы я немного подредактировал, по своему усмотрению, и заменил им тот, что в сборке http://punbb.ru
Неактивен(а)
niikto писал(а):
в lang/english/post.php:
(добавлять надо после запятой или в конец или между двумя любыми элементами массива)Код:
//Image Verification stuff //'Image verification' => 'Image Verification', 'Imgtxt' => 'Text from image', 'Image text' => 'Input text from image to text box', //'Image Text', //'Image info' => 'Please copy the text in the image to the text box above', 'Text mismatch' => 'Please make sure the text and the image match', 'Text mismatch2' => 'Try again input the text from image. Don't reload page<br /> but: if your browser not show images, and you open this page, first turn on images-show, after reload this page.<span style="color: #aa0000"> If you reloaded page, text in message area will be lost, then copy it's to copy-buffer!</span>',
Внесу небольшую поправочку. В этом коде надо экранировать кавычки: (замените это)
'Text mismatch2' => 'Try again input the text from image. Don't reload page<br /> but: if your browser not show images, and you open this page, first turn on images-show, after reload this page.<span style="color: #aa0000"> If you reloaded page, text in message area will be lost, then copy it's to copy-buffer!</span>',
На вот это:
'Text mismatch2' => 'Try again input the text from image. Don\'t reload page<br /> but: if your browser not show images, and you open this page, first turn on images-show, after reload this page.<span style="color: #aa0000"> If you reloaded page, text in message area will be lost, then copy it\'s to copy-buffer!</span>',
Еще возникла проблемка с установкой самой каптчи. Везде используется $pun_config['regs_verify_image']. Но про него в статье помоему ничего не сказано. Я добавил в админку и по аналогии в базу опцию regs_verify_image.
Кому интересно инструкция:
1) Добавляем в базу в таблицу config форума новую запись "o_regs_verify_image" равную "1".
2) Добавляем в admin_options.php
После :
if ($form['maintenance_message'] != '')
$form['maintenance_message'] = pun_linebreaks($form['maintenance_message']);
else
{
$form['maintenance_message'] = 'The forums are temporarily down for maintenance. Please try again in a few minutes.\n\n/Administrator';
if ($form['maintenance'] == '1')
$form['maintenance'] = '0';
}Этот код:
// IMAGE VERIFICATION MOD BEGIN
if ($form['regs_verify_image'] != '')
$form['regs_verify_image'] = pun_linebreaks($form['regs_verify_image']);
else
{
if ($form['regs_verify_image'] == '1')
$form['regs_verify_image'] = '0';
}
// IMAGE VERIFICATION MOD ENDДалее после:
<th scope="row">Maintenance message</th>
<td>
<textarea name="form[maintenance_message]" rows="5" cols="55"><?php echo pun_htmlspecialchars($pun_config['o_maintenance_message']) ?></textarea>
<span>The message that will be displayed to users when the board is in maintenance mode. If left blank a default message will be used. This text will not be parsed like regular posts and thus may contain HTML.</span>
</td>
</tr>
</table>
</div>
</fieldset>
</div>Этот код:
<?// IMAGE VERIFICATION MOD BEGIN?>
<div class="inform">
<fieldset>
<legend>Anti-Bot Protect</legend>
<div class="infldset">
<table class="aligntop" cellspacing="0">
<tr>
<th scope="row"><a name="Captcha">Captcha</a></th>
<td>
<input type="radio" name="form[regs_verify_image]" value="1"<?php if ($pun_config['o_regs_verify_image'] == '1') echo ' checked="checked"' ?> /> <strong>Yes</strong> <input type="radio" name="form[regs_verify_image]" value="0"<?php if ($pun_config['o_regs_verify_image'] == '0') echo ' checked="checked"' ?> /> <strong>No</strong>
<span>When enabled, guests of your forum will see captcha before posting message.</span>
</td>
</tr>
</table>
</div>
</fieldset>
</div>
<?// IMAGE VERIFICATION MOD END?>Вот после этих манипуляций в админке появится новый пункт касательно каптчи.
Отредактированно W1R0X (2007-07-04 00:15:03)
Неактивен(а)
английский пеервод поправил,
а теперь что надо сделать, чтобы в опциях появилась радиокнопка:
admin_options.php:
в разделе
<legend>Регистрация</legend>
ищем
<tr>
<th scope="row">E-mail проверка регистраций</th>
<td>
<input type="radio" name="form[regs_verify]" value="1"<?php if ($pun_config['o_regs_verify'] == '1') echo ' checked="checked"' ?> /> <strong>Да</strong> <input type="radio" name="form[regs_verify]" value="0"<?php if ($pun_config['o_regs_verify'] == '0') echo ' checked="checked"' ?> /> <strong>Нет</strong>
<span>Когда включено, пользователям посылается случайный пароль при регистрации. Они могут войти и изменить его в своем профиле на более удобный. Кроме того пользователь вынужден проверять новый e-mail адрес введенный при регистрации. Это эффективный способ избежать аато-регистраций и проверить коректность e-mail адреса всех пользователей в их профилях.</span>
</td>
</tr>этот пункт по умолчанию (со старым языковым пакетом зовётся просто "ПРОВЕРКА РЕГИСТРАЦИЙ".
после этого вставляем:
<tr>
<th scope="row">Проверка картинкой регистрации и гостей</th>
<td>
<input type="radio" name="form[regs_verify_image]" value="1"<?php if ($pun_config['o_regs_verify_image'] == '1') echo ' checked="checked"' ?> /> <strong>Да</strong> <input type="radio" name="form[regs_verify_image]" value="0"<?php if ($pun_config['o_regs_verify_image'] == '0') echo 'checked="checked"' ?> /> <strong>Нет</strong>
<span>Когда включено, пользователи должны ввести текст с картинки для подтверждения регистрации и в форме ответа. Это лучший способ избавиться от авто-регистраций ботов и не заставлять каждого пользователя подтверждать подлииность через e-mail, экономя его время.</span>
</td>
</tr>ну и надо выполнить install.php для изменения структуры базы (ато конфиг будет храниться только в кеше - это ненадолго и неправильно.
итак скачиваем архив с файлом install_mod.php, помещаем в папку с форумом (корневую), и запускаем
Неактивен(а)
Помогите мне поставить капчу. У меня стандартная 1.2.15. Поставил все по вышеуказаному описанию, только ставил для регистрации. В админке все работает, проблема одна: при регистрации всегда пишет "Введённый Вами текст не совпадает с картинкой". Где копать?
Неактивен(а)
на Ваш вопрос можете ответить только вы, я ведь не знаю что вы сделали не так. процедура описана максимально подробно, могу лишь посоветовать взять вариант ДО капчи и попробовать снова - более аккуратно.
Неактивен(а)
Bodik писал(а):
Помогите мне поставить капчу. У меня стандартная 1.2.15. Поставил все по вышеуказаному описанию, только ставил для регистрации. В админке все работает, проблема одна: при регистрации всегда пишет "Введённый Вами текст не совпадает с картинкой". Где копать?
У меня стоит последняя стандартная версия 1.2.16, я тоже всё сделал как описано выше, но сама картинка капчи не отображается. 
P.S. Адрес на картинку какой-то странный - ...../forum/include/captcha/captcha.php?PHPSESSID=4f73d8d30f0305e5576e15411cbe412a
niikto писал(а):
чем он странный? тем что расширения присущего картинке нет?
Добавлено спустя 1 минуту 2 секунды:
А вы оба добавляли сами файлы капчи, или только вышеописанные изменения сделали?
Я добавил один файл, адрес которого указан выше, но в этом файле абракадабры какие-то, нашёл по ссылкам ещё файлы в архиве и тоже загнал на сервер "kcaptcha" (первую букву убрал).
niikto писал(а):
поместите всю папку из архива не тронутой на сервер, ато я запутался что именно вы сделали
А в какую директорию? Сюда - ...../forum/include/captcha/ ? Или в корень форума?
P.S. В коде прописана такая строка "... include/captcha/captcha.php?" , а в архиве лежит файл "кcaptcha.php?"
Сами файлы капчи в прикреплённом файле. у меня они лежат в папке:
include/captcha/
поэтому их туда и распаковывайте (только чтобы не получилось include/captcha/captcha - смотрите)
в архиве есть и кcaptcha.php и captcha.php
я вот думаю - у меня форум в кроне а у вас в подпапке forum - может в этом дело...
Неактивен(а)
В архиве только кcaptcha.php, а есть ссылка выше на архив с captcha, но почему-то без расширения php, может у меня комп глючит ...!? Попробую его рассширить ...
Неактивен(а)
niikto писал(а):
http://fouroom.ru/download.php?aid=5
Да тоже самое - не фурычит ...! Бог с ней, спасибо за помощь! Поставил простенькую капчу без картинок на сложение и вычитание. С неделю полёт нормальный - спама пока нет!
простенькая - тоже хорошо - она и для людей проще. а спам появится с ней тока когда сильно популярным твой форум станет - обычные спам-боты не умеют ломать простенькие капчи, а заказные - ломают. я просто ленивый - вот и выбрал сразу такую - которая по сложнее.
Неактивен(а)
install_mod_imgver.zip поврежден - закачайте, пожалуйста, еще раз.
уважаемые, выложите неполоманный файл - СПАСИБО!
искренне удивлен опенсорс сообществом панбб - такой "отзывчивости" еще нигде не встречал!
может это тут считается платной услугой? назовите цену тогда.
rrrr писал(а):
вот так вот .... есть о чём задуматься ...
пластиковые окна
я в шоке. капча стоит, а спам появляется. в раздеде про капчу 