Всем зачастую приходится писать систему защиты от спамеров, когда занимаешься разработкой гостевой книги. Бывает так, что нет 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 свернуть / развернутьСерега ты загнул)) где ж такое?? тогда нахер ваапще php ставить ??
ну а так конечно пойдеть)) велики изобретать ты мастер, плюс!
halkin
degtyarchuk
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.