Самая простая капча

Всем зачастую приходится писать систему защиты от спамеров, когда занимаешься разработкой гостевой книги. Бывает так, что нет GD библиотеки для изображений на сервере. Поэтому не получается сформировать проверочные символы в виде имиджа. Предлагаю метод как сделать простую капчу используя только javascript, а в частности innerHTML.

Вид капчи будет в виде строки с арифметическим действием (в данном случае сложение) между двумя цифрами. Код на PHP следующий:

$varA=rand(1,23); // генерируем первое число (от 1 до 23)
$varB=rand(1,23); // генерируем второе число (от 1 до 23)
$varC=1*$varA+1*$varB; // вычисляем сумму
$smarty->assign("varA",$varA); // объявляем первое число
$smarty->assign("varB",$varB); // объявляем второе число
$smarty->assign("cryptVarC",substr(crypt($varC,"xx"),2));  // шифруем криптом сумму (и объявляем), используя детерминант "xx" (можно любой другой из 2-х символов) и вырезаем первые два символа (как раз тот самый детерминант)

В темплейте в форме отправки сообщения прописываем скрытый инпут с зашифрованной переменной и создаём пустой span с id=«aspm».

<form id="postMessage" name="msgForm" method="post" action="action/action.guestbook.php" onSubmit="return checkedFormMsg(this)">
<input name="crypt" type="hidden" value="{$cryptVarC}">
...
<tr valign="top" onmouseout="this.style.backgroundColor=''" onmouseover="this.style.backgroundColor='#c24000'">
    <td width="30%" align="right">Отзыв<font color="#cc0000">*</font></td>
    <td><textarea name="message" style="width:400px; height:150px;"></textarea></td>
</tr>
<tr valign="top" onmouseout="this.style.backgroundColor=''" onmouseover="this.style.backgroundColor='#c24000'">
    <td width="30%" align="right"><!--noindex--><noindex><span id="aspm"></span><noindex><!--/noindex--></td>
    <td>
	    <input name="keystring" type="text" style="width:120px;">
	    Антиспам<font color="#cc0000">*</font>
    </td>
</tr>
...
</form>

Далее пишем следующий яваскрипт, который отображает арифметическую операцию:

<script language="javascript">
{literal}
var aspmA = {/literal}{$varA}{literal};
var aspmB = {/literal}{$varB}{literal};
document.getElementById('aspm').innerHTML = aspmA + ' + ' + aspmB + ' = ';
{/literal}
</script>

В итоге получаем:



В файле action.guestbook.php прописываем проверку шифра:

if(substr(crypt($_POST['keystring'],"xx"),2) != $_POST['crypt']){
    header('Location: ../guestbook.php?alert=CaptchaError#alert');
    exit;
};

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

Комментарии (2)

RSS свернуть / развернуть
+
0
Бывает так, что нет GD библиотеки для изображений на сервере

Серега ты загнул)) где ж такое?? тогда нахер ваапще php ставить ??
ну а так конечно пойдеть)) велики изобретать ты мастер, плюс!
avatar

halkin

  • 7 октября 2010, 12:47
+
0
бывает «оваливается» или забывают поставить, а в суп не дозвониться. уже сталкивался. на самом деле хотел попробовать именно через innerHTML. ведь объявление переменных в яваскрипте можно так замучать или запрятать, что ни один «робот» не поймёт.
avatar

degtyarchuk

  • 7 октября 2010, 12:51

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Не забываем смотреть статистику:

Яндекс цитирования