Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2007-03-23 07:38:13

maximum
Гость

Правильная каптча

Каптча на регистрацию.

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)

#2 2007-03-23 07:49:37

hcs
Гость

Re: Правильная каптча

где инициализация $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"
дальше в этом блоке при помощи регекспа  находится сам вопрос.

#3 2007-03-23 09:28:34

maximum
Гость

Re: Правильная каптча

Ну а кто вам мешает менять сами вопросы / ответы, имена input name? Я на блоге (линк в сигнатуре) такую конструкцию успешно использую. Конечно, данную защиту грамотным людям не проблема обойти, но обычная графическая каптча распознаётся быстрее. wink

#4 2007-03-23 09:38:24

mrrc
Гость

Re: Правильная каптча

Я тут как-то приводил отчасти схожий вариант с цифрами (Надежна ли картинка с кодом от роботов?), но предлагал его как дополнение к уже имеющейся капчи для усиления защиты. На мой взгляд, не стоит отказываться от Image Verification 1.0.3 (жаль, что никто так и не сделал к нему отдельного пошагового хука для смены картинки на более сложную с captcha.ru).

Вот если бы прикрутить это на странице с регистрацией рядышком с капчей, было бы неплохо.
Как этот вариант работает, можно посмотреть здесь.

Добавлено спустя     54 минуты   37 секунд:
Причем ведь можно, наверное, при необходимости не ограничиваться выводом цифр до десятка, а требовать ввода и двойных цифр и до двадцати, плюс расширить вопрос до пяти чисел, скажем: пять, двенадцать, шестнадцать, один, восемь.

#5 2007-03-25 00:56:15

niikto
Гость

Re: Правильная каптча

ты что? - Image Verification 1.0.3 давно доработан hcs - и внедрен в сборку 21!
там какраз captcha.ru технология

#6 2007-03-25 10:41:44

mrrc
Гость

Re: Правильная каптча

niikto, что я? lol где шла речь выше, что нужно пользоваться именно сборкой форума с punbb.ru? топик о другом.

#7 2007-03-25 14:34:07

niikto
Гость

Re: Правильная каптча

объясню - берешь сборку 21, вырезаешь из неё то что ДЛЯ ТЕБЯ уже сделал hcs - и вставляешь В ЛЮБУЮ иную сборку. это очень просто

#8 2007-03-25 15:15:26

Slavik
Гость

Re: Правильная каптча

Если нужно обновить винду, берешь у друга обновленную винду, приходишь домой, копируешь себе обновленные файлы и все, винда обновлена!

Чета по-моему надо бы совместить некоторые технологии, а именно:
1. Картинка на каптче как у maximum'a
2. Проверка как в оригинальном моде на сессиях
3. А сама каптча от кого вы хотите :-)
Вот таг вот имхо наиболее хорошая защита получится

#9 2007-03-25 22:15:19

mrrc
Гость

Re: Правильная каптча

Славик хотел сказать, наверное, что можно взять из сборки register.php с include/captcha/*.* и поместить к себе на форум.

В спорах рождается истина (про каптчу).

#10 2007-03-25 23:41:50

niikto
Гость

Re: Правильная каптча

это я хотел сказать
а Слава хотел сказать умнее - что следует проверку капчи сделать не зависимой от типа используемой капчи - огда каждый выберет что ему по душе

#11 2007-03-28 07:30:11

kmb
Гость

Re: Правильная каптча

респект за капчу, понравилась... легко и просто smile

#12 2007-04-04 19:05:05

maximum
Гость

Re: Правильная каптча

Продолжение. Каптча на отправку сообщений гостями.

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)

#13 2007-06-02 17:48:41

hcs
Гость

Re: Правильная каптча

Актуально. Сегодня какойто дебилоид прошёл регистрацию и засрал форум, так что нашу каптчу, увы, можно считать сломаной. Второй фронт защиты тоже был пройден, потому что в антиспаме не нашлось нужных регекспов. Однако дополнять регистрацию новыми  тестами для пользователей -имхо не лучший вариант, иначе получится как по той ссылке "докажи что ты не робот".
Может делать каптчу с небольшими фотками предметов? Например - телефон, мышь, клавиатура, проч? smile Или простейший тест - отметьте галочкой все кружочки красного цвета, или все треугольники, или треугольник и квадратик smile Тест на дибилов, люди при регистрации либо со смеху умрут либо покрутят пальцем у виска и свалят на другие ссылки smile

#14 2007-06-03 00:48:52

maximum
Гость

Re: Правильная каптча

Зачем усложнять себе жизнь, если пока данный вариант работает.

Да можно хоть "Введите слово спам в форму" и рядом форма. Главное, чтобы не как у всех. wink

Ещё, в первом сообщении я исправил ошибку "'1 + 7 = ?' => 9".

Редактировался maximum (2007-06-03 00:50:10)

#15 2007-10-02 20:04:55

VoiD
Гость

Re: Правильная каптча

нашел интересную статью по теме
http://rmcreative.ru/article/web/antispam_no_captcha/
хочу попробовать, правда пока спамеров нету)

#16 2007-11-06 16:13:05

dmkov
Гость

Re: Правильная каптча

Подскажите не очень большому специалисту как добавить защиту на рабочий форум: www.forum.video.of.by (не сочите за рекламу, нужна помощь, достали роботы). Работает ли это? за месяц уже десяток недозарегестрировавшихся пользователей!

Редактировался dmkov (2007-11-06 16:16:19)

#17 2007-11-06 16:39:42

maximum
Гость

Re: Правильная каптча

В первом сообщении инструкция по добавлению мода, а так же сайт, где можно посмотреть в работе сам мод. wink

#18 2007-11-07 02:18:43

theUg
Гость

Re: Правильная каптча

Тут ещё вариант, такой же как здесь, но попроще: http://punbb.org/forums/viewtopic.php?pid=97474#p97474 (Сообщение 12. См. также, уточнения и изменения в последующих сообщениях). Я такую прикрутил, посмотрим, что будет. А вот идея вставить её в гостевые посты хорошая.

А что касается цветастых капчей — нужно быть осторожным. По статистике до 10% мужчин имеют ту или иную форму недостаточности цветовосприятия (чаще всего — как раз красной). Кроме того, не стоит в принципе забывать о доступности для, например, тех же слепых и слабовидящих пользователей аудио-браузеров.

#19 2007-12-02 21:43:08

nobody
Гость

Re: Правильная каптча

Взгляните на каптчу - http://forum.developers.facebook.com/register.php
Используя ее, вы помогаете оцифровывать книжки smile

#20 2007-12-16 00:58:05

bindstream
Гость

Re: Правильная каптча

Кто-нибудь развил тему с математической каптчей? Мне данный вариант больше нравится, чем графика...

#21 2007-12-16 06:02:36

maximum
Гость

Re: Правильная каптча

Это типа как, вместо арифметики предлагать например дифференциальные уравнения? hmm   
И получится как в сообщении выше - "используя её, вы помогаете студентам института N выполнять домашние задания". big_smile

#22 2007-12-17 01:25:44

bindstream
Гость

Re: Правильная каптча

Нет, я имел ввиду новый подход... если шло обсуждение про обход защиты.

Вот, например, код из 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)

#23 2007-12-17 11:15:25

maximum
Гость

Re: Правильная каптча

Лучше же использовать что - то своё, ну и конечно не забывать про необходимость периодического усовершенствования подобных систем.

Указанный в данной теме вариант я использую, без глобальных изменений, в своей сборке. Прием работы смотрите в первом сообщении темы. Могу лишь добавить, что спам боты на форуме пасутся постоянно, хотя и тупые. И как вы можете заметить, с начала (21.04.07) работы форума прошло достаточно времени, но ни один бот не прошёл успешно регистрацию, а так же не оставил ни одного сообщения (для гостей отправка сообщений разрешена).

А тупые боты по тому, что они не выполняют проверку на успешность постинга. К слову, ещё в 2005 году это было хорошим тоном любой уважающей себя спамилки. smile

#24 2007-12-17 16:51:08

bindstream
Гость

Re: Правильная каптча

maximum пишет:

Лучше же использовать что - то своё, ну и конечно не забывать про необходимость периодического усовершенствования подобных систем.

Я конечно за! Но вариант от sNews - универсальный. Сам генирит и сам считает + md5, как я думаю, что-то дает. Я хочу заняться этим, но мне придется поднимать все с нуля... копать punbb. А ты, уже человек "в теме". Поэтому взываю к твоей помощи!

По моим наблюдениям: боты "сезонные" - то их навалом, то нет ни одного. Регистрируются, но не получают почту с паролем. Но все равно в списке пользователей иметь подобные крендели не хочется. Да и e-mail постоянно грузится отчетами о недоставленных письмах и т.п. В гостевом разделе спокойно отписывают другие боты - куча безсмысленных ссылок. Вот их тоже хочу подрезать.

#25 2007-12-18 22:41:18

bindstream
Гость

Re: Правильная каптча

Занялся математической каптчей окончательно. Если кто заинтересовался, ждите... скоро будет готово.

Подвал доски

Под управлением FluxBB. Хостинг Hostens