Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Каптча на регистрацию.
register.php
находим
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
заменяем на
$captcha_questions = array(
'5 + 3 = ?' => 8,
'4 - 3 = ?' => 1,
'2 + 7 = ?' => 9,
'8 - 6 = ?' => 2,
'4 + 5 = ?' => 9,
'9 - 4 = ?' => 5
);
$captcha_index = rand(0,count($captcha_questions)-1);
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
находим
else if (isset($_POST['form_sent']))
{
заменяем на
else if (isset($_POST['form_sent']))
{
// Check the captcha
$p_question = trim($_POST['captcha_q']);
$p_answer = trim($_POST['captcha']);
$questions_arry = array();
foreach ($captcha_questions as $k => $v)
$questions_arry[md5($k)] = $v;
if (empty($questions_arry[$p_question]) || $questions_arry[$p_question] != $p_answer)
message($lang_register['Captcha warn']);
находим
<p><input type="submit" name="register" value="<?php echo $lang_register['Register'] ?>" /></p>
заменяем на
<div class="inform">
<fieldset>
<legend><?php echo $lang_register['Captcha'] ?></legend>
<div class="infldset">
<?php
$question = array_keys($captcha_questions);
$qencoded = md5($question[$captcha_index]);
?>
<p><?php echo $lang_register['Captcha desc'] ?></p>
<label><strong><?php echo $question[$captcha_index] ?></strong><br />
<input name="captcha" id="captcha" type="text" size="7" maxlength="7" />
<input name="captcha_q" value="<?php echo $qencoded ?>" type="hidden" /><br /></label>
</div>
</fieldset>
</div>
<p><input type="submit" name="register" value="<?php echo $lang_register['Register'] ?>" /></p>
lang/english/register.php
добавляем в конец
'Captcha' => 'Protection against automatic registration',
'Captcha desc' => 'To finish registration answer a following question.',
'Captcha warn' => 'The number entered by you is incorrect.',
lang/russian/register.php
добавляем в конец
'Captcha' => 'Защита от автоматической регистрации',
'Captcha desc' => 'Для того, чтобы завершить регистрацию ответьте на следующий вопрос.',
'Captcha warn' => 'Введённое вами число неверно.',
Пример работы: http://wpforum.ru/
Редактировался maximum (2007-06-03 00:49:22)
где инициализация $qencoded?
самый первый блок кода, на который заменям, содержит синтаксическую ошибку.
Добавлено спустя 17 минут 16 секунд:
Ломается это элементарно - берется вопрос, вычисляется результат, формируется пост запрос содержащий: captcha_q&captcha=распарсеный_ответ
Парсер вопроса такой, ищется строка:
<input name="captcha" id="captcha" type="text" size="7" maxlength="7" />
Значение captcha_q находится ниже строкой, это судя по коду не ид сесси, а просто хэш вопроса, его можно безнаказанно использовать.
Строка с вопросом находится на строку выше, из нее берется всё что внутри тэга <strong>, убираются пробелы и все после знака =.
Оставшаяся часть строки разбивается на две части, и определяется математическая операция путём нехитрого анализа.
Если прятать вопрос в других тэгах, то парсер чуть усложняется - ищется блок верхнего уровня, в котором лежит <input name="captcha" id="captcha"
дальше в этом блоке при помощи регекспа находится сам вопрос.
Ну а кто вам мешает менять сами вопросы / ответы, имена input name? Я на блоге (линк в сигнатуре) такую конструкцию успешно использую. Конечно, данную защиту грамотным людям не проблема обойти, но обычная графическая каптча распознаётся быстрее.
Я тут как-то приводил отчасти схожий вариант с цифрами (Надежна ли картинка с кодом от роботов?), но предлагал его как дополнение к уже имеющейся капчи для усиления защиты. На мой взгляд, не стоит отказываться от Image Verification 1.0.3 (жаль, что никто так и не сделал к нему отдельного пошагового хука для смены картинки на более сложную с captcha.ru).
Вот если бы прикрутить это на странице с регистрацией рядышком с капчей, было бы неплохо.
Как этот вариант работает, можно посмотреть здесь.
Добавлено спустя 54 минуты 37 секунд:
Причем ведь можно, наверное, при необходимости не ограничиваться выводом цифр до десятка, а требовать ввода и двойных цифр и до двадцати, плюс расширить вопрос до пяти чисел, скажем: пять, двенадцать, шестнадцать, один, восемь.
ты что? - Image Verification 1.0.3 давно доработан hcs - и внедрен в сборку 21!
там какраз captcha.ru технология
niikto, что я? где шла речь выше, что нужно пользоваться именно сборкой форума с punbb.ru? топик о другом.
объясню - берешь сборку 21, вырезаешь из неё то что ДЛЯ ТЕБЯ уже сделал hcs - и вставляешь В ЛЮБУЮ иную сборку. это очень просто
Если нужно обновить винду, берешь у друга обновленную винду, приходишь домой, копируешь себе обновленные файлы и все, винда обновлена!
Чета по-моему надо бы совместить некоторые технологии, а именно:
1. Картинка на каптче как у maximum'a
2. Проверка как в оригинальном моде на сессиях
3. А сама каптча от кого вы хотите :-)
Вот таг вот имхо наиболее хорошая защита получится
Славик хотел сказать, наверное, что можно взять из сборки register.php с include/captcha/*.* и поместить к себе на форум.
В спорах рождается истина (про каптчу).
это я хотел сказать
а Слава хотел сказать умнее - что следует проверку капчи сделать не зависимой от типа используемой капчи - огда каждый выберет что ему по душе
респект за капчу, понравилась... легко и просто
Продолжение. Каптча на отправку сообщений гостями.
post.php
находим
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
заменяем на
$cptchList = array(
'1 + 1' => 2,
'5 + 1' => 6,
'9 - 2' => 7,
'6 - 3' => 3,
'2 + 6' => 8,
'7 - 4' => 3
);
function asciihtml($textHtml) {
$textHtml = html_entity_decode(htmlentities($textHtml, ENT_COMPAT, 'UTF-8'));
$asciiHtml = '';
for ($i = 0; $i < strlen($textHtml); $i++) {
$asciiHtml .= '&#'.ord($textHtml[$i]).';';
}
return $asciiHtml;
}
function cptchQuestion() {
global $cptchList;
$cptchIndex = rand(0, count($cptchList)-1);
$cptchQstsList = array_keys($cptchList);
$cptchQst = $cptchQstsList[$cptchIndex];
$cptchQstMd5 = md5($cptchQst);
$cptchQstHtml = asciihtml($cptchQst.' =');
$resultArray = array($cptchQstHtml, $cptchQstMd5);
return $resultArray;
}
function cptchReponse() {
global $cptchList, $lang_common;
$cptchQstsMd5List = array();
foreach ($cptchList as $cle => $val) {
$cptchQstsMd5List[md5($cle)] = $val;
}
$cptchQstUsr = trim($_POST['captcha_q']);
$cptchRepUsr = trim($_POST['captcha']);
$messageOk = 0;
if (empty($cptchQstsMd5List[$cptchQstUsr]) || $cptchQstsMd5List[$cptchQstUsr] != $cptchRepUsr) { $messageOk = 1; }
$message = '<p>'.$lang_common['Captcha warn'].'</p>';
$resultArray = array($messageOk, $message);
return $resultArray;
}
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
находим
if (isset($_POST['form_sent']))
{
заменяем на
if (isset($_POST['form_sent']))
{
if ($pun_user['is_guest']) {
$cptchRepRes = cptchReponse();
if ($cptchRepRes[0]) { message($cptchRepRes[1], $cptchRepRes[2]); }
}
находим
}
else if (isset($_POST['preview']))
{
заменяем на
}
else if (isset($_POST['preview']))
{
if ($pun_user['is_guest']) {
$cptchRepRes = cptchReponse();
if ($cptchRepRes[0]) { message($cptchRepRes[1], $cptchRepRes[2]); }
}
находим
?>
</div>
<div class="inform">
<fieldset>
<legend><?php echo $lang_common['Options'] ?></legend>
<div class="infldset">
<div class="rbox">
<?php echo implode('<br /></label>'."\n\t\t\t\t", $checkboxes).'<br /></label>'."\n" ?>
</div>
</div>
</fieldset>
<?php
}
заменяем на
?>
</div>
<div class="inform">
<fieldset>
<legend><?php echo $lang_common['Options'] ?></legend>
<div class="infldset">
<div class="rbox">
<?php echo implode('<br /></label>'."\n\t\t\t\t", $checkboxes).'<br /></label>'."\n" ?>
</div>
</div>
</fieldset>
<?php
}
if ($pun_user['is_guest']) {
$cptchQstRes = cptchQuestion();
?>
<br />
<fieldset>
<legend><?php echo $lang_common['Captcha'] ?></legend>
<div class="infldset">
<p><?php echo $lang_common['Captcha desc'] ?></legend>
<strong><?php echo $cptchQstRes[0] ?></strong>
<input name="captcha" id="captcha" type="text" size="5" maxlength="10" style="text-align: center;" />
<input name="captcha_q" value="<?php echo $cptchQstRes[1] ?>" type="hidden" />
</p>
</div>
</fieldset>
<?php
}
lang/english/common.php
добавляем в конец
'Captcha' => 'Protection',
'Captcha desc' => 'Execute following arithmetic action:',
'Captcha warn' => 'The number entered by you is incorrect, try again.',
lang/russian/common.php
добавляем в конец
'Captcha' => 'Защита',
'Captcha desc' => 'Выполните следующее арифметическое действие:',
'Captcha warn' => 'Введённое вами число неверно, попробуйте снова.',
Добавлено спустя 7 минут 25 секунд:
Ах да, посмотреть, как это работает, вы можете всё там же.
И ещё, часть полезной информации я подчерпнул у французов, на форумах http://www.punbb.fr/ и http://fredomkb.free.fr/forum/.
Редактировался maximum (2007-04-04 19:14:43)
Актуально. Сегодня какойто дебилоид прошёл регистрацию и засрал форум, так что нашу каптчу, увы, можно считать сломаной. Второй фронт защиты тоже был пройден, потому что в антиспаме не нашлось нужных регекспов. Однако дополнять регистрацию новыми тестами для пользователей -имхо не лучший вариант, иначе получится как по той ссылке "докажи что ты не робот".
Может делать каптчу с небольшими фотками предметов? Например - телефон, мышь, клавиатура, проч? Или простейший тест - отметьте галочкой все кружочки красного цвета, или все треугольники, или треугольник и квадратик Тест на дибилов, люди при регистрации либо со смеху умрут либо покрутят пальцем у виска и свалят на другие ссылки
Зачем усложнять себе жизнь, если пока данный вариант работает.
Да можно хоть "Введите слово спам в форму" и рядом форма. Главное, чтобы не как у всех.
Ещё, в первом сообщении я исправил ошибку "'1 + 7 = ?' => 9".
Редактировался maximum (2007-06-03 00:50:10)
нашел интересную статью по теме
http://rmcreative.ru/article/web/antispam_no_captcha/
хочу попробовать, правда пока спамеров нету)
Подскажите не очень большому специалисту как добавить защиту на рабочий форум: www.forum.video.of.by (не сочите за рекламу, нужна помощь, достали роботы). Работает ли это? за месяц уже десяток недозарегестрировавшихся пользователей!
Редактировался dmkov (2007-11-06 16:16:19)
В первом сообщении инструкция по добавлению мода, а так же сайт, где можно посмотреть в работе сам мод.
Тут ещё вариант, такой же как здесь, но попроще: http://punbb.org/forums/viewtopic.php?pid=97474#p97474 (Сообщение 12. См. также, уточнения и изменения в последующих сообщениях). Я такую прикрутил, посмотрим, что будет. А вот идея вставить её в гостевые посты хорошая.
А что касается цветастых капчей — нужно быть осторожным. По статистике до 10% мужчин имеют ту или иную форму недостаточности цветовосприятия (чаще всего — как раз красной). Кроме того, не стоит в принципе забывать о доступности для, например, тех же слепых и слабовидящих пользователей аудио-браузеров.
Взгляните на каптчу - http://forum.developers.facebook.com/register.php
Используя ее, вы помогаете оцифровывать книжки
Кто-нибудь развил тему с математической каптчей? Мне данный вариант больше нравится, чем графика...
Это типа как, вместо арифметики предлагать например дифференциальные уравнения?
И получится как в сообщении выше - "используя её, вы помогаете студентам института N выполнять домашние задания".
Нет, я имел ввиду новый подход... если шло обсуждение про обход защиты.
Вот, например, код из sNews:
function mathCaptcha($input='', $sum='') {
$length = 4;
if (isset($_POST['calc'])) {
if (is_numeric($input) && strlen($sum) == $length) {$math = substr(md5($input),0,$length) === $sum ? $input : null;}
}
else {
$x = rand(1, 9); $y = rand(1, 9);
$sum = substr(md5($x+$y),0,$length);
$math = '<p><label for="calc">* '.l('math_captcha').':</label><br />';
$math .= $x.' + '.$y.' = ';
$math .= '<input type="text" name="calc" id="calc" /></p>';
$math .= '<p><input type="hidden" name="sum" value="'.$sum.'" /></p>';
}
return $math;
}
Может быть такой подход актуальнее? Здесь все вычисляется на ходу.
Вызов функции такой:
if (md5($user) === s('username') && md5($pass) === s('password') && mathCaptcha($_POST['calc'], $_POST['sum'])) {
$_SESSION[db('website').'Logged_In'] = token();
}
Мастер, ты можешь интегрировать такую каптчу в punbb?
Естественно, интересуют все формы ввода данных: регистрация, ответ пользователя, ответ гостя, создание темы и т.п.
Редактировался bindstream (2007-12-17 01:27:05)
Лучше же использовать что - то своё, ну и конечно не забывать про необходимость периодического усовершенствования подобных систем.
Указанный в данной теме вариант я использую, без глобальных изменений, в своей сборке. Прием работы смотрите в первом сообщении темы. Могу лишь добавить, что спам боты на форуме пасутся постоянно, хотя и тупые. И как вы можете заметить, с начала (21.04.07) работы форума прошло достаточно времени, но ни один бот не прошёл успешно регистрацию, а так же не оставил ни одного сообщения (для гостей отправка сообщений разрешена).
А тупые боты по тому, что они не выполняют проверку на успешность постинга. К слову, ещё в 2005 году это было хорошим тоном любой уважающей себя спамилки.
Лучше же использовать что - то своё, ну и конечно не забывать про необходимость периодического усовершенствования подобных систем.
Я конечно за! Но вариант от sNews - универсальный. Сам генирит и сам считает + md5, как я думаю, что-то дает. Я хочу заняться этим, но мне придется поднимать все с нуля... копать punbb. А ты, уже человек "в теме". Поэтому взываю к твоей помощи!
По моим наблюдениям: боты "сезонные" - то их навалом, то нет ни одного. Регистрируются, но не получают почту с паролем. Но все равно в списке пользователей иметь подобные крендели не хочется. Да и e-mail постоянно грузится отчетами о недоставленных письмах и т.п. В гостевом разделе спокойно отписывают другие боты - куча безсмысленных ссылок. Вот их тоже хочу подрезать.
Занялся математической каптчей окончательно. Если кто заинтересовался, ждите... скоро будет готово.