Быстрый лёгкий надёжный форумный движок
Вы не вошли.
В модификации участвуют следующие файлы:
- include/functions.php
- lang/russian/common.php
- register.php
- lang/russian/register.php
- post.php
Открываем 'include/functions.php', ищем:
function dump()
{
echo '<pre>';
$num_args = func_num_args();
for ($i = 0; $i < $num_args; ++$i)
{
print_r(func_get_arg($i));
echo "\n\n";
}
echo '</pre>';
exit;
}
После добавляем:
function mathCaptcha($input='', $sum='') {
$length = 4;
if (isset($_POST['req_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>'.$lang_common['CaptchaQuestion'].'</label><br />';
$math .= $x.' + '.$y.' = ';
$math .= '<input type="text" name="req_calc"/></p>';
$math .= '<p><input type="hidden" name="sum" value="'.$sum.'" /></p>';
}
return $math;
}
Сохраняем, закрываем.
Открываем 'lang/russian/common.php', ищем:
'Posted' => 'Posted' // The date/time a topic was started
После добавляем:
// Captcha
'CaptchaQuestion' => 'Чему будет равняться:'
Сохраняем, закрываем.
Открываем 'register.php', ищем:
<?php
require PUN_ROOT.'footer.php';
}
else if (isset($_POST['form_sent'])
После добавляем:
&& mathCaptcha($_POST['req_calc'], $_POST['sum'])
Ищем:
$required_fields = array('req_username' => $lang_common['Username'], 'req_password1' => $lang_common['Password'], 'req_password2' => $lang_prof_reg['Confirm pass'], 'req_email1' => $lang_common['E-mail'], 'req_email2' => $lang_common['E-mail'].' 2'
После добавляем:
, 'req_calc' => $lang_register ['Calc']
Ищем:
<div class="inform">
<fieldset>
<legend><?php echo $lang_prof_reg['Privacy options legend'] ?></legend>
<div class="infldset">
<p><?php echo $lang_prof_reg['E-mail setting info'] ?></p>
<div class="rbox">
<label><input type="radio" name="email_setting" value="0" /><?php echo $lang_prof_reg['E-mail setting 1'] ?><br /></label>
<label><input type="radio" name="email_setting" value="1" checked="checked" /><?php echo $lang_prof_reg['E-mail setting 2'] ?><br /></label>
<label><input type="radio" name="email_setting" value="2" /><?php echo $lang_prof_reg['E-mail setting 3'] ?><br /></label>
</div>
<p><?php echo $lang_prof_reg['Save user/pass info'] ?></p>
<div class="rbox">
<label><input type="checkbox" name="save_pass" value="1" checked="checked" /><?php echo $lang_prof_reg['Save user/pass'] ?><br /></label>
</div>
</div>
</fieldset>
</div>
После добавляем:
<div class="inform">
<fieldset>
<legend><?php echo $lang_register['CaptchaLegend'] ?></legend>
<div class="infldset">
<p><?php echo $lang_register['CaptchaInfo'] ?></p>
<?php echo mathCaptcha() ?>
</div>
</fieldset>
</div>
Сохраняем, закрываем.
Открываем 'lang/russian/register.php', ищем:
'Confirm e-mail' => 'Подтвердите e-mail адрес'
После добавляем:
// Captcha
'Calc' => 'Проверочный код',
'CaptchaLegend' => 'Защита от автоматической регистрации',
'CaptchaInfo' => 'Для того, чтобы завершить регистрацию ответьте на следующий вопрос.'
Сохраняем, закрываем.
Открываем 'post.php', ищем:
// Did someone just hit "Submit" or "Preview"?
if (isset($_POST['form_sent'])
После добавляем:
&& mathCaptcha($_POST['req_calc'], $_POST['sum'])
Ищем:
$required_fields = array('req_email' => $lang_common['E-mail'], 'req_subject' => $lang_common['Subject'], 'req_message' => $lang_common['Message']
После добавляем:
, 'req_calc' => $lang_register['Calc']
Ищем:
<?php
while (list(, $cur_error) = each($errors))
echo "\t\t\t\t".'<li><strong>'.$cur_error.'</strong></li>'."\n";
?>
</ul>
</div>
</div>
</div>
<?php
}
else if (isset($_POST['preview'])
После добавляем:
&& mathCaptcha($_POST['req_calc'], $_POST['sum'])
Ищем:
<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>
После добавляем:
<?php if ($pun_user['is_guest']) { ?>
<div class="inform">
<fieldset>
<legend><?php echo $lang_register['CaptchaLegend'] ?></legend>
<div class="infldset">
<p><?php echo $lang_register['CaptchaInfo'] ?></p>
<?php echo mathCaptcha() ?>
</div>
</fieldset>
</div>
<?php } ?>
Сохраняем, закрываем.
Все протестировал на работоспособность. Изменения учитывают статус пользователя - "зарегистрированный" или "гость" и выдают поля с каптчей только для последнего. Вроде, как все "по-уму".
Прошу всех позитивных РобоАдминов проверить код на дыры, т.к. я не спец. Каптча скажем - версия 1. Доработки будут. Пока не разбирал механизм выдачи message - а нужно сделать не обнуление полей каптчи, а именно вывод предупредительного сообщения об ошибке. Сейчас только ява-скрипт проверяет на наличие данных в поле каптчи... но "сценарии" можно и остановить.
Еще раз призову всех заинтересовавшихся к участию в разработке правильной матиматической каптчи.
Редактировался bindstream (2007-12-23 20:18:25)
Представленный выше вариант уже имеет несколько багов. Надо собрать все вместе, затем и опубликую. Данная каптча ставилась на форум на котором постоянно трутся СПАМ-боты. В итоге, они ее обходят. Сменил цифры на текст - не имеет значения. Есть подозрение, что они как-то читают md5.
Может ли такое быть? И что можно здесь еще придумать?
Ели уж боты распознают замусореный текст, то математические операции компьютеры выполняют быстрее человека в тысячи-миллионы раз. Найти текст вокруг инпута и выделить ключевые слова в нем дело нехитрое: #([0+9]{1,3})\s+(\+)\s+([0+9]{1,3})\s+\=#
Для разнообразия в регекспе можно проверять не только математическую операцию "сложение", как это сделано у тебя, а и все другие возможные операции.
Следующим шагом в этом напрвлении стороны разработчиков каптч можно ожидать картинку с вопросом "сколько будет 2+2", вместо голого текста
Как временный вариант решения можно подключить java-скрипт, который в нужном месте впишет ключевой вопрос.
Есть подозрение, что они как-то читают md5.
Он у тебя в форме прописан.
Он у тебя в форме прописан.
Я знаю. Скорректирую вопрос: "Есть подозрение, что они как-то расшифровывают md5". Но это же не возможно... типа только сервер это может сделать.
bindstream, ты ставишь под сомнение способность ботов производить нехитрые математические операции? md5 расхэшировать могут, а сложить два однозначных числа - нет?
Проведи следственный эксперимент, вместо хэша передавай идентификатор сессии, он никак не связан с "суммой". Результат соответсвенно храни в переменной сессии и проверяй его с тем что присылает пользователь. Можешь хранить результат в БД, например добавив поле в таблицу online. Тогда в форме не будет ни идентификатора сессии ни твоего хэша. Я понятно выразился?
Если боты и тут пройдут, значит им положить на хэш.
hcs, как бы ты написал условие в моем случае с учетом особенностей punbb, - если введенное в поле каптчи значение пустое или не равно должному... - как punbb на это должен реагировать?
Просто интересен твой вариант, - может я часть недопонимаю.
В способности порно-ботов расшифровывать хэш все-таки сомневаюсь. Думаю, здесь банальные дыры.
Какие дыры? Навскидку самая элементарная - все данные передает серверу клиент, на сервере даже нет никакой защиты от банальной подмены хэша. Например злонамеренный бот, подменяет реферер (это нетрудно), вставляет в скрытое поле "sum"=md5(4), а в поле каптчи - 4, в тело сообщения всечто угодно и отправляет эту форму тебе. Что делает твой код с полученными данными каптчи?
Вобщем код не выдержитвает никакой критики.
Я вот на счет #1 собщения в теме хочу сказать:
Если поле captcha_q из формы вообще убрать, а данные этого поля передавать через form_sent.
И второе: Почему бы не дописывать случайный набор символов спереди и сзади определенной длины к $qencoded при вставке в форму, а потом отрезать их при получении данных регистрации.
Затруднит ли это ботам взлом каптчи?
Поставил каптчу на регу, что в первом посте, спамеры исчезли.
Так что пока можно и ей пользоваться ).
Поставил каптчу на регу, что в первом посте, спамеры исчезли.
Так что пока можно и ей пользоваться ).
На то она и правильная каптча, что ей всегда можно будет пользоваться.
имхо это как вирусы и антивирусы, надо будет - заспамят
идеальной капчи нету
ИМХО каптча что здесь + проверка e-mail очень неплохая защита.
Смысл в том чтобы сократить кол-во возможных спаммеров, чтобы облегчить работу модерам.
В конечном счете люди противостоят людям, а не программы программам.
каптча + проверка e-mail = какой в этом смысл? Лишний геморрой для юзеров, имхо, надо оставлять что-то одно. Я оставил у себя одну каптчу, потому что многим не проходит письмо с кодом активации. Да и сама активация по мылу - лишний геморрой. А боты, вроде, тьфу, тьфу, тьфу - не идут. Стоит "Image Verifycation".
имхо это как вирусы и антивирусы, надо будет - заспамят
идеальной капчи нету
А идеальная нам как раз таки и противопоказана.
каптча + проверка e-mail = какой в этом смысл? Лишний геморрой для юзеров, имхо, надо оставлять что-то одно. Я оставил у себя одну каптчу, потому что многим не проходит письмо с кодом активации. Да и сама активация по мылу - лишний геморрой. А боты, вроде, тьфу, тьфу, тьфу - не идут. Стоит "Image Verifycation".
У меня на всех форумах активация по email включена, и я не считаю это лишним, только это не для борьбы со спамом...
Я оставил у себя одну каптчу, потому что многим не проходит письмо с кодом активации.
Единственная причина оставить только CAPTCHA только если проблемы с рассылкой активации. Всегда полезно иметь реальный мейл пользователя. Для рассылки например.
получать\неполучть рассылку право пользователя, если он не хочет ничего получать, то мыло бесполезно.
случай с регистрацией по мылу можно объяснить, например защитой от проникновения ботов в закрытые для гостей разделы, хотя безусловно этот способ очень прост для обхода.
какие другие случаи иметь мыло полезны?
Если пользователь подписывается на тему, то при подтверждении регистрации через e-mail 100% грантия получения письма о новом ответе в теме.
Для маленького форума не актуально, а для большого, на мой взгляд, полезно. Когда в форуме много новых сообщений, пользователи идут по рассылке в те тему, которые их волнуют.
ОФФ:
А у меня даже без e-mail все равно самая правильная каптча
:ОФФ
Если пользователь подписывается на тему...
его проблемы, если он указал не верный мейл. К тому же, всегда можно изменить его в профиле, если нужно. К тому же с "постояльцами" связаться и узнать мыло не проблема, если очень нужно. Реальное мыло "остальных" юзеров мне зачем знать?
Потому и считаю, что по сути активация по мылу это лишняя заморочка, из-за которой, к тому же (при плохой работе почты )), можно потерять много потенциальных постояльцев.
да если надо сильно, то зарегится и с подтверждением (по себе сужу)
Конечно зарегится (хотя найдется 1 из 100 который пройдет мимо), но вопрос в дружественности к пользователю. Например есть ресурсы, на которых линки скрыты от гостей. Весьма недружественный акт к посетителю. Особенно, если от него потом потребуется активация аккаунта по мылу. В довершении посетителя убъет тот факт, что ссылка оказалась дохлой. А время ушло.
Так минута за минутой у нас крадут жизнь всяческие активации по мылу. Лучше в таком случае повесить фрейм, по которому пользователю нужно кликнуть, чтобы пройти регистрацию, а в фрейме разместить ссылку на рекламодателя.
Потому и считаю, что по сути активация по мылу это лишняя заморочка,
В этом есть и обратная сторона, не будут люди на "всякий случай" регатся. Если форум большой или тематика очень строгая, это больше полезно, чем вредно.
региться на всякий случай??? ))))))
типа мало ли, потом регистрацию закроют)
Часто незарегистрированные пользователи не могут видеть ссылки, голосовать иметь доступ в определенные разделы.
Я часто регистрируюсь, чтобы профиль был "постарше" и в закладки ссылку кидаю.
какие другие случаи иметь мыло полезны?
В первую очередь это показатель заинтересованности человека.
Во вторых, защита от повторных регистраций либо обращений к администратору, по поводу восстановления забытого сразу же после регистрации пароля или смены ошибочного email.
Продолжать?