|
|
|
| Подскажите, пожалуйста простой PHP вариант защиты от спам-роботов (или как их там называют) и помогите модернизировать мой PHP код.
Хотел сделать простую защиту путем указания ответа от сложения двух одинарных случайных чисел:
<?php
$ob1 = rand('11','99');
$ob1 = strrev($ob1); // реверс строки
$ob1 = substr($ob1, 1, 1); // извлекаем 2 символов, начиная с 2
$ob2 = rand('11','99');
$ob2 = substr($ob2, 1, 1); // извлекаем 2 символов, начиная с 4
?>
<?php
echo "$ob1 + $ob2 = "; // выводим результаты генератора перед полем "otvet"
$summa1 = $ob1+$ob2; // вычисляем результат
?>
<input name="otvet" type="text" class="pole" size="11" maxlength="3" id="otvet" value="<?php echo @$_POST['otvet'] ?>">
<?php
if(!empty($_POST['otvet'])) // сверяем данные
{
$otvet = $_POST['otvet'];
$otvet = trim($otvet);
$otvet = stripslashes($otvet);
$otvet = htmlspecialchars($otvet);
if ($otvet!=$summa1)
{
exit ("<br><span class = 'ohibka'>Ответ защиты от спама не верный!</span>");
}
}
?>
|
Но код работает не верно, т.к. сравнение результатов происходит после отправки формы, а генератор уже выдает другие цифры после обновления страницы (форма обрабатывается на этой же странице).
Не знаю как быть...
Можно, конечно извлекать случайные числа из базы данных, но не хотелось бы грузить лишний раз базу и процессор.
Можно использовать Java Script но его можно отключить, да и вообще использую его в крайних случаях. | |
|
|
|
|
|
|
|
для: sega_z
(21.05.2012 в 21:18)
| | Вам нужно как-то передать информацию в обход GET и POST параметров. Для этого традиционного используют сессию - кладите в сессию ответ, а в обработчике сравнивайте ответ и то, что ввел "пользователь". | |
|
|
|
|
|
|
|
для: cheops
(21.05.2012 в 22:21)
| | ..... но это не защита, а имитация защиты. | |
|
|
|
|
|
|
|
для: Sfinks
(22.05.2012 в 09:44)
| | В современных условиях да, но передача информации по сессии потребуется в любом случае, будь это капча или просто прошивка сессией. | |
|
|
|
|
|
|
|
для: cheops
(22.05.2012 в 10:40)
| | Само собой.
__________
sega_z, не изобретайте велосипед. http://captcha.ru/ - и реально работает и описано как прикрутить. | |
|
|
|
|
|
|
|
для: Sfinks
(22.05.2012 в 11:08)
| | А почему арифметические действия не являются хорошей защитой? | |
|
|
|
|
|
|
|
для: sega_z
(23.05.2012 в 10:45)
| | Может потому, что компьютер читает и,тем более считает, намного лучше человека. | |
|
|
|
|
|
|
|
для: sega_z
(23.05.2012 в 10:45)
| | Потому что они написаны у вас текстом в коде страницы. Код страницы можно пропарсить и вычислить заданный пример. Если бы у вас арифметическое действие было отображено картинкой, чтоб ее было сложно прочитать роботу, то это было бы защитой. Но если картинка будет простая - типа написано ровным стандартным шрифтом с одинаковой высотой букв и равномерным фоном - то такие картинки читаются элементарно. Соответственно либо берите готовое, либо, если очень хочется свое, пишите скрипт рисования картинки. Но в него придется заложить как минимум: разные шрифты, деформацию цифр, зашумление фона и самой надписи. | |
|
|
|
|
|
|
|
для: Sfinks
(23.05.2012 в 11:10)
| | Благодарю за полноценный ответ!
Ваша ссылка мне понравилась, единственно, что мне не нравится в http://captcha.ru, это то, что её иногда очень трудно прочитать человеку!
Вот если бы в ней были только числа, было бы намного лучше!
Может как то это можно исправить? | |
|
|
|
|
|
|
|
для: sega_z
(23.05.2012 в 12:42)
| | в настройках можно указать символы, которые не будут появляться, например, обычно блочат букву О и цифру 0, потому что они не отличимы в некоторых шрифтах, а также букву l(эль) строчную, I (ай) заглавную и цифру 1.
# KCAPTCHA configuration file
$alphabet = "0123456789abcdefghijklmnopqrstuvwxy z"; # do not change without changing font files!
# symbols used to draw CAPTCHA
//$allowed_symbols = "0123456789"; #digits
$allowed_symbols = "23456789abcdeghkmnpqsuvxyz"; #alphabet without similar symbols (o=0, 1=l, i=j, t=f)
|
| |
|
|
|
|
|
|
|
для: elenaki
(23.05.2012 в 12:59)
| | Спасибо, только я не совсем понял куда и какие файлы архива нужно загрузить на сервер и где код для вывода каптчи, который нужно вставить на мою страницу? | |
|
|
|
|
|
|
|
для: Sfinks
(22.05.2012 в 11:08)
| | велосипед?! Чо уже совсем котелок не варит, даже каптчу осилить не можем? | |
|
|
|
|
|
|
|
для: Красная_шляпа
(23.05.2012 в 20:34)
| | Просто не разу не подключал сторонние скрипты, в первый раз всегда не просто понять чужие скрипты. Это для Вас все просто, а для меня нет.
Не могу понять зачем папки "fonts" и "util". | |
|
|
|
|
|
|
|
для: sega_z
(23.05.2012 в 20:52)
| | просто так авторам захотелось чтобы шрифты в одной папке лежали | |
|
|
|
|
|
|
|
для: Красная_шляпа
(23.05.2012 в 21:05)
| | Т.е. если я правильно понимаю:
1) все файлы архива должны находится в одной папке.
2) вывод каптчи на страницу осуществляется кодом в файле form_example.php (только не понял какой именно файл должен быть обработчиком формы).
Можно ли объединить скрипты на страницах: form_example.php и index.php? | |
|
|
|
|
|
|
|
для: sega_z
(23.05.2012 в 21:39)
| | в корневой каталог кидаете папку fonts и файлы captcha.php, kcaptcha.php и kcaptcha_config.php.
в последнем - настройки капчи. в форму в любое место вставить код
<table>
<tr>
<td><input type="text" name="keystring" size="10" class="input_mic"></td>
<td><img name="pic" src="captcha.php?<?=session_name()?>=<?=session_id()?>" style="BORDER: #3b6782 1px solid; cursor:pointer;" onclick="this.src='captcha.php?<?=session_name()?>=<?=session_id()?>'+Math.random()" alt="Click here to refresh picture" width=100 height=50></td>
</tr>
</table>
|
в обработчике формы проверять
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_POST['keystring']){ ...}
|
не забыть обнулить после окончания проверки и посылки
unset($_SESSION['captcha_keystring']);
|
| |
|
|
|
|
|
|
|
для: elenaki
(24.05.2012 в 10:38)
| | Для чего предназначен файл .htaccess, который находится в папке "fonts"?
Нужен ли он вообще:
<Files ~ "*">
Order allow,deny
Deny from all
</Files>
|
| |
|
|
|
|
|
|
|
для: sega_z
(26.05.2012 в 22:03)
| | Он закрывает доступ к шрифтам из браузера, т.е. доступ получают только PHP-скрипты. Если оставите его - хуже не будет. Удалите - тоже ничего сверх-критичного не произойдет. | |
|
|
|
|
|
|
|
для: cheops
(26.05.2012 в 22:07)
| | Подскажите, пожалуйста, как сделать, чтобы картинка обновлялась не при клике на картинку, а при клике на ссылку "Другие цифры" на языке Java Script.
<table>
<tr>
<td><input type="text" name="keystring" size="10" class="input_mic"></td>
<td>
<img name="pic" src="captcha.php?<?=session_name()?>=<?=session_id()?>" style="BORDER: #3b6782 1px solid; cursor:pointer;" onclick="this.src='captcha.php?<?=session_name()?>=<?=session_id()?>'+Math.random()" alt="Click here to refresh picture" width=100 height=50><br>
<a href="#">Другие цифры</a>
</td>
</tr>
</table> | |
|
|
|
|
|
|
|
для: sega_z
(28.05.2012 в 01:05)
| |
<a href="#" onclick="document.getElementById('pic').src='captcha.php?<?=session_name()?>=<?=session_id()?>'+Math.random()">Другие цифры</a>
|
только прeдварительно надо заменить в тэге img name на id (или прописать другой id, отличный от name и указать его в onclicki)
<img name="pic" id='pic'... | |
|
|
|
|
|
|
|
для: sega_z
(28.05.2012 в 01:05)
| | <a href="#"> - а вы пробовали щелкать по такой ссылке? | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 10:03)
| | да. а что? прекрасно меняет картинку. если вы о том, что нет курсора в виде пальца, так это прекрасно исправляется стилями, но про это разговора не не было. | |
|
|
|
|
|
|
|
для: elenaki
(28.05.2012 в 10:16)
| | Картинку вообще-то не сама ссылка меняет, но в не в этом дело, а в том, что если документ пусть даже слегка будет прокручен, то такой щелчок неизбежно приведет к переходу в ее начало. Это что есть хорошо? Использовать ссылку ради того чтобы сделать щелчок, это уже правило плохого тона, и если делать, то хотя бы прерывать последующие после щелчка действия. | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 10:24)
| | 1. задание было - как сделать щелчок не на картинке, а на ссылкe - сделано
2. у меня каптча - в форме, страница умещается на экране, никакого скачка нет (и разговора о том, чтобы остаться на том же месте, не было)
3. я вообще не для вас это делала - ухожу | |
|
|
|
|
|
|
|
для: elenaki
(28.05.2012 в 10:29)
| | >я вообще не для вас это делала
Так и я не для вас изначально написал. :) | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 12:51)
| | Из вашего диалога я понял, что не совсем правильно использовать данный код:
<a href="#" onclick="document.getElementById('pic').src='captcha.php?<?=session_name()?>=<?=session_id()?>'+Math.random()">Другие цифры</a>
|
Курсор в виде пальца отображается, как на обычных ссылках.
А как тогда правильно? | |
|
|
|
|
|
|
|
для: sega_z
(28.05.2012 в 13:35)
| | Сделайте страничку, которая бы имела вертикальный скроллинг (наставьте переносов, например), а конце ее поместите тег А с атрибутом href="#". Щелкните по этой ссылке. Что наблюдаем? | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 13:49)
| | Вы правы, это очень не удобно, т.к. страница каждый раз показывается с самого начала.
Ещё минус в том, что в конце URL адреса добавляется "#".
Подскажите пожалуйста, как правильно решить данную задачу с JS ссылкой? | |
|
|
|
|
|
|
|
для: sega_z
(28.05.2012 в 14:04)
| | Это удобно, когда оно к месту. # определяет якорь на странице, то есть переход внутри ее, и если было бы, например, #head, то документ был бы прокручен до элемента с таким id (также используются и <a name="head">). Поэтому и скачает страница в начало в поисках того, чего нет, при таких ссылках.
Сделать щелчок можно по любому элементу на странице, а не только по тегу А. Можете заменить его на span, к примеру, а если нужно чтобы и курсор был ручкой у него, то никто вам не запрещает такое указать в стилях для него.
Если все таки так хочется использовать тег А, то прерывайте переход по якорю:
<a href="#" onclick="runFunction(); return false;">Опля</a> | |
|
|
|