Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от спам-роботов
 
 автор: sega_z   (21.05.2012 в 21:18)   письмо автору
 
 

Подскажите, пожалуйста простой PHP вариант защиты от спам-роботов (или как их там называют) и помогите модернизировать мой PHP код.

Хотел сделать простую защиту путем указания ответа от сложения двух одинарных случайных чисел:


<?php 
$ob1 
rand('11','99');
$ob1 strrev($ob1); // реверс строки
$ob1 substr($ob111); // извлекаем 2 символов, начиная с 2
$ob2 rand('11','99');
$ob2 substr($ob211); // извлекаем 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 но его можно отключить, да и вообще использую его в крайних случаях.

  Ответить  
 
 автор: cheops   (21.05.2012 в 22:21)   письмо автору
 
   для: sega_z   (21.05.2012 в 21:18)
 

Вам нужно как-то передать информацию в обход GET и POST параметров. Для этого традиционного используют сессию - кладите в сессию ответ, а в обработчике сравнивайте ответ и то, что ввел "пользователь".

  Ответить  
 
 автор: Sfinks   (22.05.2012 в 09:44)   письмо автору
 
   для: cheops   (21.05.2012 в 22:21)
 

..... но это не защита, а имитация защиты.

  Ответить  
 
 автор: cheops   (22.05.2012 в 10:40)   письмо автору
 
   для: Sfinks   (22.05.2012 в 09:44)
 

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

  Ответить  
 
 автор: Sfinks   (22.05.2012 в 11:08)   письмо автору
 
   для: cheops   (22.05.2012 в 10:40)
 

Само собой.
__________

sega_z, не изобретайте велосипед. http://captcha.ru/ - и реально работает и описано как прикрутить.

  Ответить  
 
 автор: sega_z   (23.05.2012 в 10:45)   письмо автору
 
   для: Sfinks   (22.05.2012 в 11:08)
 

А почему арифметические действия не являются хорошей защитой?

  Ответить  
 
 автор: Yuriev   (23.05.2012 в 11:00)   письмо автору
 
   для: sega_z   (23.05.2012 в 10:45)
 

Может потому, что компьютер читает и,тем более считает, намного лучше человека.

  Ответить  
 
 автор: Sfinks   (23.05.2012 в 11:10)   письмо автору
 
   для: sega_z   (23.05.2012 в 10:45)
 

Потому что они написаны у вас текстом в коде страницы. Код страницы можно пропарсить и вычислить заданный пример. Если бы у вас арифметическое действие было отображено картинкой, чтоб ее было сложно прочитать роботу, то это было бы защитой. Но если картинка будет простая - типа написано ровным стандартным шрифтом с одинаковой высотой букв и равномерным фоном - то такие картинки читаются элементарно. Соответственно либо берите готовое, либо, если очень хочется свое, пишите скрипт рисования картинки. Но в него придется заложить как минимум: разные шрифты, деформацию цифр, зашумление фона и самой надписи.

  Ответить  
 
 автор: sega_z   (23.05.2012 в 12:42)   письмо автору
 
   для: Sfinks   (23.05.2012 в 11:10)
 

Благодарю за полноценный ответ!
Ваша ссылка мне понравилась, единственно, что мне не нравится в http://captcha.ru, это то, что её иногда очень трудно прочитать человеку!
Вот если бы в ней были только числа, было бы намного лучше!
Может как то это можно исправить?

  Ответить  
 
 автор: elenaki   (23.05.2012 в 12:59)   письмо автору
 
   для: 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)

  Ответить  
 
 автор: sega_z   (23.05.2012 в 20:05)   письмо автору
 
   для: elenaki   (23.05.2012 в 12:59)
 

Спасибо, только я не совсем понял куда и какие файлы архива нужно загрузить на сервер и где код для вывода каптчи, который нужно вставить на мою страницу?

  Ответить  
 
 автор: Красная_шляпа   (23.05.2012 в 20:34)   письмо автору
 
   для: Sfinks   (22.05.2012 в 11:08)
 

велосипед?! Чо уже совсем котелок не варит, даже каптчу осилить не можем?

  Ответить  
 
 автор: sega_z   (23.05.2012 в 20:52)   письмо автору
 
   для: Красная_шляпа   (23.05.2012 в 20:34)
 

Просто не разу не подключал сторонние скрипты, в первый раз всегда не просто понять чужие скрипты. Это для Вас все просто, а для меня нет.
Не могу понять зачем папки "fonts" и "util".

  Ответить  
 
 автор: Красная_шляпа   (23.05.2012 в 21:05)   письмо автору
 
   для: sega_z   (23.05.2012 в 20:52)
 

просто так авторам захотелось чтобы шрифты в одной папке лежали

  Ответить  
 
 автор: sega_z   (23.05.2012 в 21:39)   письмо автору
 
   для: Красная_шляпа   (23.05.2012 в 21:05)
 

Т.е. если я правильно понимаю:

1) все файлы архива должны находится в одной папке.
2) вывод каптчи на страницу осуществляется кодом в файле form_example.php (только не понял какой именно файл должен быть обработчиком формы).

Можно ли объединить скрипты на страницах: form_example.php и index.php?

  Ответить  
 
 автор: elenaki   (24.05.2012 в 10:38)   письмо автору
 
   для: 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']);

  Ответить  
 
 автор: sega_z   (26.05.2012 в 22:03)   письмо автору
 
   для: elenaki   (24.05.2012 в 10:38)
 

Для чего предназначен файл .htaccess, который находится в папке "fonts"?

Нужен ли он вообще:


<Files ~ "*">
    Order allow,deny
    Deny from all
</Files>

  Ответить  
 
 автор: cheops   (26.05.2012 в 22:07)   письмо автору
 
   для: sega_z   (26.05.2012 в 22:03)
 

Он закрывает доступ к шрифтам из браузера, т.е. доступ получают только PHP-скрипты. Если оставите его - хуже не будет. Удалите - тоже ничего сверх-критичного не произойдет.

  Ответить  
 
 автор: sega_z   (28.05.2012 в 01:05)   письмо автору
 
   для: 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>

  Ответить  
 
 автор: elenaki   (28.05.2012 в 09:41)   письмо автору
 
   для: 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'...

  Ответить  
 
 автор: confirm   (28.05.2012 в 10:03)   письмо автору
 
   для: sega_z   (28.05.2012 в 01:05)
 

<a href="#"> - а вы пробовали щелкать по такой ссылке?

  Ответить  
 
 автор: elenaki   (28.05.2012 в 10:16)   письмо автору
 
   для: confirm   (28.05.2012 в 10:03)
 

да. а что? прекрасно меняет картинку. если вы о том, что нет курсора в виде пальца, так это прекрасно исправляется стилями, но про это разговора не не было.

  Ответить  
 
 автор: confirm   (28.05.2012 в 10:24)   письмо автору
 
   для: elenaki   (28.05.2012 в 10:16)
 

Картинку вообще-то не сама ссылка меняет, но в не в этом дело, а в том, что если документ пусть даже слегка будет прокручен, то такой щелчок неизбежно приведет к переходу в ее начало. Это что есть хорошо? Использовать ссылку ради того чтобы сделать щелчок, это уже правило плохого тона, и если делать, то хотя бы прерывать последующие после щелчка действия.

  Ответить  
 
 автор: elenaki   (28.05.2012 в 10:29)   письмо автору
 
   для: confirm   (28.05.2012 в 10:24)
 

1. задание было - как сделать щелчок не на картинке, а на ссылкe - сделано
2. у меня каптча - в форме, страница умещается на экране, никакого скачка нет (и разговора о том, чтобы остаться на том же месте, не было)
3. я вообще не для вас это делала - ухожу

  Ответить  
 
 автор: confirm   (28.05.2012 в 12:51)   письмо автору
 
   для: elenaki   (28.05.2012 в 10:29)
 

>я вообще не для вас это делала

Так и я не для вас изначально написал. :)

  Ответить  
 
 автор: sega_z   (28.05.2012 в 13:35)   письмо автору
 
   для: confirm   (28.05.2012 в 12:51)
 

Из вашего диалога я понял, что не совсем правильно использовать данный код:

<a href="#" onclick="document.getElementById('pic').src='captcha.php?<?=session_name()?>=<?=session_id()?>'+Math.random()">Другие цифры</a>


Курсор в виде пальца отображается, как на обычных ссылках.
А как тогда правильно?

  Ответить  
 
 автор: confirm   (28.05.2012 в 13:49)   письмо автору
 
   для: sega_z   (28.05.2012 в 13:35)
 

Сделайте страничку, которая бы имела вертикальный скроллинг (наставьте переносов, например), а конце ее поместите тег А с атрибутом href="#". Щелкните по этой ссылке. Что наблюдаем?

  Ответить  
 
 автор: sega_z   (28.05.2012 в 14:04)   письмо автору
 
   для: confirm   (28.05.2012 в 13:49)
 

Вы правы, это очень не удобно, т.к. страница каждый раз показывается с самого начала.
Ещё минус в том, что в конце URL адреса добавляется "#".
Подскажите пожалуйста, как правильно решить данную задачу с JS ссылкой?

  Ответить  
 
 автор: confirm   (28.05.2012 в 14:19)   письмо автору
 
   для: sega_z   (28.05.2012 в 14:04)
 

Это удобно, когда оно к месту. # определяет якорь на странице, то есть переход внутри ее, и если было бы, например, #head, то документ был бы прокручен до элемента с таким id (также используются и <a name="head">). Поэтому и скачает страница в начало в поисках того, чего нет, при таких ссылках.
Сделать щелчок можно по любому элементу на странице, а не только по тегу А. Можете заменить его на span, к примеру, а если нужно чтобы и курсор был ручкой у него, то никто вам не запрещает такое указать в стилях для него.
Если все таки так хочется использовать тег А, то прерывайте переход по якорю:
<a href="#" onclick="runFunction(); return false;">Опля</a>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования