2 варианта капчи для сайта

капча на сайт

От автора: интернет вещь хорошая, удобная, полезная, но… было бы совсем замечательно, если бы там не было спамеров. Думаю, все мы сталкивались с таким неприятным явлением, как спам. Это могут быть спамовые письма, спамовые комментарии, в общем, различный мусор. Если на Вашем сайте есть форма обратной связи или система комментариев и Ваш ресурс станет довольно популярным, то ему не избежать внимания спамеров. Эффективной защитой от спама является проверка на человечность — капча.

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

План урока:

    1. Постановка задач (8:01)

    2. Алгоритм капчи №1. Начинаем реализацию (14:56)

    3. Реализуем капчу с математическим выражением (12:03)

    4. Реализуем капчу вопрос-ответ (17:49)

скачать исходникискачать урок

1. Постановка задачи

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

Для того, чтобы не отправлять сообщения, заполненные ботами придуман не один способ. Наверное, самым первым и наиболее известным является CAPTCHA (аббревиатура, обозначающая приблизительно следующее — "автоматизированный тест для различия компьютеров и людей")… но вместе с тем — это самый неудобный для пользователя вариант (на мой взгляд). Думаю, многие сталкивались с заполнением капчи — иногда приходится буквально "расшифровывать" ее, гадая — что же это за символ? Вроде расшифровал, вводишь… получаешь сообщение, что заполнено неверно… начинаем заново наши потуги на поприще дешифрования… иногда вообще методом тыка догадываешься, что разработчики именно этой капчи учитывают еще и регистр символов, но при этом, ни слова не сказали об этом… появляется при этом стойкое желание назвать таких разработчиков нехорошим словом.

Да и к тому же на сегодня капча не является уже надежной защитой от автоматического заполнения формы или автоматической регистрации — боты "умнеют" и зачастую могут распознавать ее (из собственного опыта: на форуме со стандартной капчей, который ставил для одной фирмы, в день было до 10 автоматических регистраций, соответственно, примерно столько же непотребных тем, после замены капчи на антибот типа "вопрос-ответ" боты больше не регистрировались)… кроме того, существуют даже ресурсы, которые нанимают кликеров, чтобы те работали на благо спамеров — вводили символы с капчи.

В общем, традиционная капча не самый удачный вариант. Сегодня есть куда более надежные средства проверки на человечность, которые, к тому же, гораздо удобнее для пользователя.

Вот некоторые варианты, которые, на мой взгляд, с успехом могут конкурировать с традиционной капчей:

    1. посчитать результат сложения (или другого математического действия) двух случайных чисел;

    2. дать ответ на простой вопрос, типа "Название нашей планеты";

    3. снять/установить галочку в чекбоксе;

    4. кликнуть по определенной картинке из ряда предложенных.

Именно первые два варианта мы и реализуем в этом уроке. Для урока мы возьмем простенькую форму из двух полей, посредством которой будем отправлять значение одного из полей на e-mail. Значение второго поля — это и будет результат проверки на человечность. Создадим страницу index.php с кодом формы:

<form method="post" action="">
	<table>
		<tr>
			<td>Текст: </td><td><input type="text" name="text" /></td>
		</tr>
		<tr>
			<td>Выражение: </td><td><input type="text" name="res" /></td>
		</tr>
		<tr>
			<td colspan="2"><input type="submit" name="submit" value="Send" /></td>
		</tr>
	</table>
</form>

Думаю, на этом с вводной частью можно закончить и переходить к созданию алгоритма и его реализации.

2. Алгоритм капчи №1. Начинаем реализацию

Алгоритм реализации капчи с математическим выражением очень прост. Что нам необходимо? Нам необходимы 2 случайным образом сгенерированных числа, допустим от 1 до 10. Далее, мы, конечно же, должны хранить для себя результат сложения этих чисел, чтобы после того, как пользователь отправит данные, мы смогли сравнить его результат с нашим. Если результаты совпадут — проверка на человечность пройдена и можно отправлять данные на e-mail, иначе — проверка не пройдена, и мы должны сгенерировать 2 новых числа, запомнить результат их сложения и предложить пользователю попробовать еще раз. Все просто. Приступим к реализации алгоритма.

Чтобы сгенерировать числа мы воспользуемся функцией rand(), генерирующей случайное целое число в заданном диапазоне. Над кодом формы откроем конструкцию PHP и приступим к кодированию:

<?php
session_start();

$a = rand(1,10);
$b = rand(1,10);
?>

Итак, в переменных $a и $b у нас теперь есть случайные числа от 1 до 10. Кроме того, мы открыли сессию функцией session_start(). Думаю, Вы догадались для чего нам это нужно. Мы ведь должны где-то хранить результат сложения двух чисел после отправки данных из формы в обработчик, а проще всего сделать это используя механизм сессий. Создадим сессионную переменную и присвоим ей результат математической операции — у меня это будет сложение:

<?php
session_start();

$a = rand(1,10);
$b = rand(1,10);
$_SESSION['res'] = $a + $b;
?>

Отлично!

Осталось вывести для пользователя сгенерированные числа в нужном месте формы:

<tr>
		<td><?php echo $a. ' + ' .$b. ' = ';?></td><td><input type="text" name="res" /></td>
	</tr>

Теперь мы можем сделать промежуточное тестирование уже написанного. Для этого после старта сессии напишем следующий код:

<?php
session_start();

if($_POST['submit']){
	if($_POST['res'] == $_SESSION['res']){
		echo 'OK';
	}else{
		echo 'Not OK';
	}
}

$a = rand(1,10);
$b = rand(1,10);
$_SESSION['res'] = $a + $b;
?>

Что означают эти строки кода?

Прежде всего, первым условием мы проверяем существует ли элемент submit в глобальном массиве POST. Это делается для того, чтобы проверить была ли нажата кнопка формы — кнопка имеет имя submit, потому-то мы и проверяем именно наличие этого элемента в POST-данных. Итак, если была нажата кнопка, то будет выполняться код в операторных скобках, иначе — этот код будет пропускаться. Ну а в операторных скобках мы также задали условие. Этим условием мы, собственно, и сравниваем то, что получили от пользователя, с тем, что у нас хранится в сессионной переменной $_SESSION['res']. Если оба значения совпадают — проверка пройдена и будет выведено "OK", иначе — проверка на человечность не пройдена.

Собственно, капча уже готова. Осталось только написать необходимый нам код для обоих случаев (пройдена/не пройдена проверка). Давайте напишем простенький код для отправки данных из первого текстового поля на почтовый адрес. Мы не будем усложнять контактную форму несколькими полями, не будем добавлять дополнительные проверки (например, на обязательное заполнение полей) и прочее, поскольку это не является целью данного урока. Если же Вы хотите узнать как написать полноценную форму обратной связи — рекомендую Вам посмотреть мой цикл уроков (2 урока около 4 часов) по созданию полноценной формы обратной связи.

Итак, для начала мы напишем код для блока иначе (else), который срабатывает в том случае, если проверка не пройдена. Что нам нужно сделать в этом случае? Нужно сгенерировать 2 новых числа и сообщить пользователю, что он не прошел проверку. Для всего этого нам понадобится полностью перегрузить страницу — в этом нам поможет функция header() — и создать новую сессионную переменную, в которую будем записывать сообщения для пользователя об успехе или неудаче.

Код прост:

<?php
session_start();

if($_POST['submit']){
	if($_POST['res'] == $_SESSION['res']){
		
	}else{
		$_SESSION['mes'] = '<p>Дан неверный ответ!</p>';
		header("Location: index.php");
		exit();
	}
}

$a = rand(1,10);
$b = rand(1,10);
$_SESSION['res'] = $a + $b;
?>

Теперь осталось вывести значение переменной $_SESSION['mes'] в нужном месте, например, под формой. Также мы должны сразу же разрегистрировать эту сессионную переменную, поскольку ее значение должно выводиться только 1 раз и после обновления страницы ее быть не должно.

Под формой напишем код:

<?php
echo $_SESSION['mes'];
unset($_SESSION['mes']);
?>

Теперь при тестировании написанного, если мы неверно ответим на проверочное выражение, то будет выведено сообщение "Дан неверный ответ!", т.е. сработает, как и должно, блок иначе. Если ответ будет верен — сработает блок условие, но, так как он пока что пуст — ничего выводиться не будет. Теперь займемся отправкой письма в блоке условия.

3. Реализуем капчу с математическим выражением

Письмо формируется при помощи функции mail(), а затем его отправляет почтовый сервер. Данная функция имеет 3 обязательных аргумента:

    1. $to — адрес e-mail;

    2. $subject — тема сообщения;

    3. $body — тело сообщения.

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

Создадим 4 переменные и функцией mail() сформируем письмо уже готовое для отправки:

<?php
session_start();

if($_POST['submit']){
	if($_POST['res'] == $_SESSION['res']){
		$to = 'mail@mail.ru';
		$subject = 'Письмо с сайта';
		$body = $_POST['text'];
		$headers = 'Content-type:text/plain; Charset=windows-1251';
		
		if(mail($to, $subject, $body, $headers)){
			$_SESSION['mes'] = '<p>Письмо отправлено!</p>';
			header("Location: index.php");
			exit();
		}else{
			$_SESSION['mes'] = '<p>Ошибка!</p>';
			header("Location: index.php");
			exit();
		}
	}else{
		$_SESSION['mes'] = '<p>Дан неверный ответ!</p>';
		header("Location: index.php");
		exit();
	}
}

$a = rand(1,10);
$b = rand(1,10);
$_SESSION['res'] = $a + $b;
?>

Немного поясним код.

В переменной $to указываем e-mail, на который должно уходить сообщение. В переменную $body помещаем текст, полученный от пользователя из формы. В переменной $headers указываем тип письма (обычный текст) и кодировку (кириллица (Windows)) — я указываю именно эту кодировку, поскольку тестирую скрипт на Денвере, который по умолчанию имеет такую кодировку.

Далее задаем условие, в котором формируем письмо. Если все будет отработано (функция mail() вернет TRUE) — в сессионную переменную $_SESSION['mes'] поместим сообщение об успехе и сделаем редирект для обновления страницы. Иначе — помещаем сообщение об ошибке и также производим редирект. Теперь можно протестировать работу формы с написанной нами капчей. Если Вы также тестируете на Денвере, то все сформированные письма можно найти по адресу: Буква локального диска:\tmp\!sendmail. Так как на Денвере установлена заглушка — письма не отправляются, а складываются именно в этот каталог. Если же Вы тестируете скрипт в сети — письмо будет отправлено на указанный в переменной $to e-mail.

Таким образом, первая капча нами реализована. Теперь приступим к реализации второй.

4. Реализуем капчу вопрос-ответ

В этой капче у нас будет база вопросов и ответов на них (вопросов может быть сколь угодно много). Пользователю будет предложено ответить на случайно выбранный вопрос. Ну а дальше все идет по тому же алгоритму, что и в предыдущей капче. Таким образом, наша задача создать базу вопросов-ответов и случайным образом выбрать вопрос. При этом в сессионную переменную необходимо записать ответ на этот вопрос, чтобы затем сравнить его с ответом пользователя.

Для наших целей создадим новый файл (например, index2.php), в который скопируем код из предыдущего файла. Внесем минимальные правки в созданный файл: изменим везде редирект на текущий файл (index2.php) и удалим строки с генерированием чисел и записью результата сложения в сессионную переменную.

Теперь создадим базу вопросов-ответов. Хранить их можно, например, в БД, в текстовом файле или любом удобном хранилище информации. Выберем для этих целей массив. Массив будет многомерным — каждый элемент созданного массива будет также массивом, элементами которого, в свою очередь, будет вопрос и ответ. На месте генерирования чисел создаем массив с необходимыми данными — у меня будет 3 пары вопрос-ответ (Вы можете сделать таких пар гораздо больше — все ограничено лишь Вашей фантазией). Обращаю внимание на то, что все ответы должны быть записаны в нижнем регистре:

$question = array(array(0 => 'Название нашей планеты',
						1 => 'земля'),
				  array(0 => 'Царь зверей',
						1 => 'лев'),
				  array(0 => 'Адам и...',
						1 => 'ева'));

Теперь для того, чтобы вывести на экран, допустим, вопрос "Царь зверей" — нам достаточно обратиться к массиву $question таким образом:

echo $question[1][0];

То есть мы обращаемся вначале к элементу с ключем 1 — это массив с нужным вопросом -, а затем к вопросу, который имеет ключ 0. Обратим внимание, что все вопросы во вложенных массивах имеют одинаковый ключ — 0, а все ответы — 1. Таким образом, для случайного выбора вопроса достаточно сгенерировать первый ключ (в нашем случае это будет число от 0 до 2). Для этого создадим переменную $key и в нее поместим сгенерированное число в заданном диапазоне — это и будет первый ключ:

$key = rand(0,count($question)-1); // ключ

Здесь мы указали, как и положено, два параметра для функции rand(). С минимумом понятно — это ноль (нумерация элементов массива по умолчанию начинается с нуля). Второй параметр можно было указать явно — 2. Но тогда наш скрипт немного потерял бы в универсальности — ведь если изменится количество вопросов, то придется менять и максимум в функции. Чтобы количество вопросов считалось автоматически, воспользуемся функцией count() — она считает количество элементов массива. В нашем случае функция вернет 3 (3 элемента в массиве). Но последний вопрос имеет ключ 2, а потому мы отнимем от результата, который вернет функция count() единицу и получим нужный результат.

Осталось запомнить соответствующий выбранному вопросу ответ. Первый ключ у нас есть, а второй всегда равен 1 для ответов:

$key = rand(0,count($question)-1); // ключ
$_SESSION['res'] = $question[$key][1]; // ответ

Теперь выведем выбранный вопрос в нужном месте формы:

<tr>
		<td><?php echo $question[$key][0];?></td><td><input type="text" name="res" /></td>
	</tr>

Собственно, вторая капча уже практически готова и можно ее уже протестировать. Осталось дописать пару небольших мелочей. Помним, что важно было писать все ответы в нижнем регистре. Это сделано неспроста — мы ведь не знаем, в каком именно виде получим от пользователя ответ, скажем на вопрос "Название нашей планеты"… это может быть такой ответ — "Земля", а может быть и такой — "Земля". Эти ответы не идентичны. Соответственно, мы должны сделать их идентичными для скрипта. А сделать это совсем несложно. Достаточно привести ответ пользователя к нижнему регистру, в чем нам поможет функция strtolower(). Также, на всякий случай, можно обрезать пробелы с обоих концов полученной от пользователя строки (делается это на случай, если пользователь случайно ввел вместе с ответом пробел). Обрезать пробелы с начала и конца строки поможет функция trim(). Внесем соответствующие изменения в строку кода, где проверяется совпадение полученного от пользователя с тем, что есть у нас:

if(strtolower(trim($_POST['res'])) == $_SESSION['res'])

Заключение

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

Хотите узнать, что необходимо для создания сайта?

Посмотрите 3-х минутное видео и у Вас будет четкий пошаговый план по созданию сайта с нуля!

Смотреть видео

Метки:

Похожие записи

  1. Новая reCaptcha от Google

Комментарии Вконтакте:

Комментарии Facebook:

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

  1. Игорь

    Супер!
    Давно хотел это реализовать. Интересно, спасибо!

  2. svetlana

    Добрый день.

    Пожалуйста, не могли бы Вы подсказать, как сохранить урок: —
    И последующие.

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

    С уважением, Светлана

    • Виктор Рог

      Достаточно просто кликнуть на картинку «Скачать урок». Данная картинка-ссылка расположена над видео окном.

    • Олег Алексеевич

      Edf;ftvfz svetlana сохранить урок проще простого,я не знаю каким браузером Вы пользуетесь,я поьзуюсь Мозилой,итак,в вверху выше(ниже) браузерной строки есть ряд функций(файл,правка,вид,Журнал,Инструменты,Справка) На вкладке Файл,нажимаете левой кнопкой мыши,откроется диалоговое меню,из которого надо выбрать пункт «Сохранить как» откроется окно где Вас спросят куда Вы хотите сохранить файл,не забудьте указать что сохранить надо Веб сайт полностью строка (тип файла). Аналогично можно сохранить страницу, нажав сочетание клавиш Ctr+S

  3. Сергей Звягин

    Да, иногда спам, что называется, достает. Спасибо за хороший урок.

  4. Василий Мирчук

    Пока не во всех тонкостях разобрался. Но урок нужный. Благодарю

  5. Александр

    Спасибо за урок, очень нужная вещь!
    Вопрос не в тему-на этот сайт довольно много комментариев на несколько статей,но это в админке. Вы не сможете научить,как эти комментарии вставить на свой сайт ?
    C уважением Александр.

  6. юра

    Полезная инфа,спасибо за урок.

  7. Барбара

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

  8. www.blog-press.ru

    Да, да, да. Урок нужный а то спамеры замучали.

  9. Серёга

    фигня. Любой начинающий могбы догадатся как это зделать. Лучше бы тогда показали как с картинок делать.

    • Андрей Кудлай

      Содержательный комментарий ;)
      Извините, что не оправдали ожиданий )))
      Все же позволю себе усомниться, что ЛЮБОЙ начинающий мог бы догадаться как это сделать… согласен, ничего особо сложного здесь нет, но, тем не менее, на форумах частенько можно увидеть вопросы от начинающих как реализовать капчу вопрос-ответ.

      • Александр

        Серега прав. Начинающий смог бы такое написать. Но не стоит забывать, что есть несколько типов начинающих:
        1) Которые хотят понять и научиться программировать;
        2) Которые не хотят понять, а хотят чтобы все само работало;
        3) Которые думают, что они самые умные и крутые и не хотят погуглить пару минут;

    • Pocherk

      Если CAPTCHA делать с картинок, то надо задействовать функции графической библиотеки php_gd2.dll, а это лишняя нагрузка на сервер и некоторые хостеры эту библиотеку не подключают.
      А урок отличный! Одобрям-с-с-с!

  10. Иван

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

    • Андрей Кудлай

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

      • Иван

        Спамеру достаточно будет один раз посетить сайт и посмотреть список доступных вариантов ответов, для того чтобы создать словарь и бота, который будет эти варианты подставлять. Поэтому чем больше вопросов с ответами, тем ниже вероятность взлома.
        Для меня наиболее привлекательным является 4 вид капчи. Так как при клике на нужную картинку, можно javascript-ом устанавливать скрытое поле или еще что-нибудь можно придумать. А javascript понимают не все боты, на сколько мне известно

        • Андрей Кудлай

          Что мешает периодически обновлять базу вопросов-ответов, дополнять ее? Как Вы сами сказали, чем больше эта база, тем ниже вероятность взлома… хотя слово «взлом» здесь весьма условно, ведь фактически ничего не хакается.
          По поводу JS, то с ним еще проще — это вообще клиентская часть, почему бы ее не читать ботам?
          А вообще, универсального решения нет, любое ограничение можно пройти — вопрос только в соотношении цель/средства.

          • Иван

            Бот то может прочитать клиентскую часть, а вот выполнить не сможет. Или я ошибаюсь?
            По поводу универсального решения абсолютно с Вами согласен. Если на сайте используется «уникальная» капча, т.е. та которая не стоит на популярных движках и т.д., то спамеру нет смысла разрабатывать бота под неё, ведь кругом полно других сайтов которые он может пройти (в смысле бот)

          • Pocherk

            Полностью согласен — любую защиту можно взломать. Вопрос только в том, что стОит ли это затраченного времени и средств.

    • Андрей Кудлай

      Так в том то весь и смысл, что клиентская часть не предназначена для таких вещей, как капча :)
      Смысл клиентской части в улучшении юзабельности, а проверки/защиту нужно возлагать только на серверную часть. Боту и не нужно ничего делать с клиентской частью, он ее просто уберет из исходного кода. К примеру, для отправки данных на сервер необходимо, чтобы все поля были заполнены. Пока они не заполнены JS блокирует кнопку отправки. Отлично! Мы берем исходный код формы, убираем весь JS из него и свободно отправляем данные на сервер.
      Ну и: «Если на сайте используется «уникальная» капча, т.е. та которая не стоит на популярных движках и т.д., то спамеру нет смысла разрабатывать бота под неё, ведь кругом полно других сайтов которые он может пройти»… вот это в точку. Это то, о чем говорилось относительно соотношения цель/средства. Писать отдельного бота под уникальную капчу (а это уж никак не строка на шумовой картинке) слишком дорогое решение, которое может быть оправдано только соответствующей целью.
      А так, действительно полно сайтов, блогов, форумов, на которых стоит рядовая капча в изначальной ее реализации…
      так зачем платить больше? ;)

      • Иван

        По поводу JS, вот если делать допустим при клике на определенную кнопку, типа «Я не бот», брать и дописывать в action формы дополнительный параметр или устанавливать скрытое поле определенное значение. Тогда ведь бот не сможет кликнуть по кнопке и эти данные не будут переданы. А можно ведь форму отправлять через AJAX, и ни как инача. Для бота ведь это будет трудоемкой задачей?

        • Андрей Кудлай

          По первому. К примеру, по клику на картинку мы создаем скрытое поле с параметром и передаем его. Опять же, смотрим, что это за параметр и изначально создаем форму с этим параметром… вуаля, форма уйдет на сервер безо всяких кликов по картинкам. Здесь все просто, достаточно просмотреть клиентский код.
          По второму. Если на сервере проверяется метод передачи данных (если не ошибаюсь, из массива $_SERVER['HTTP_X_REQUESTED_WITH'], хотя, кстати, не каждый сервер предоставляет это значение массива), то тут уже, скорее всего, ничего не сделаешь… но, возвращаясь к предыдущему комменту: «полно сайтов, блогов, форумов, на которых стоит рядовая капча в изначальной ее реализации…»

  11. mark

    а можно сделать урок по защите email от спамеров посредством JavaScript имеется ввиду случай когда в футере сайта пишется info@site.com при этом пользователь кликнув по ссылке открывает новое письмо в почтовом клиенте, а спам бот email прочитать не может

    встречал решения складывани email по буквам но спам боты научились читать такую конструкцию

    если эффективное решение в этом случае против спама?

  12. Игорь

    Спасибо за урок, очень помог ) + молодец, что сразу 2 темы затронул — капча и отправка mail.

  13. Раиса

    Классно, особенно таким как я! В программировании ноль,но надеюсь, что применить смогу. А то сайту условно три дня, а уже с 10 попыток что-то продать!

  14. Мария

    Уважаемый автор
    Вопрос от начинающего, который не разбирается в php_, но хочет, чтобы его вполне достойный сайт не мусорили нехорошие люди, что они делают весьма агрессивно, несмотря на поставленную капчу в виде «введите цифрами число, написанное словами». Я пытаюсь поставить капчу в виде «вопрос — ответ», но ваших разъяснений недостаточно для совсем чайников. У меня стоит вот эта гостевая: softtime.ru/info/gbfile.php. Вставлять ваш код надо, судя по всему, в файл addrec.php, но у меня не работает. Буду признательна за ответ, так как поиск в Гугле в течение дня не дал никаких намеков на готовый код для капчи «вопрос-ответ»

    • Андрей Кудлай

      Уважаемая начинающая, если Вы вообще не разбираетесь в PHP, то лучше взять капчу попроще — с математическим выражением.
      Только ради Вас скачал по ссылке гостевую, с тем, чтобы подсказать алгоритм решения. Итак, в файле addrec.php изначально установлено пустое значение для переменной $error. Эта переменная является своеобразным флагом: если после всех проверок она останется пустой — добавляем запись в файл, иначе — что-то не устроило нас.
      Соответственно, в форму необходимо добавить поле для ввода результата математического выражения, а затем, получив результат этого поля из формы, сравнить с тем, что хранится в сессии (не забываем открывать сессию). Если результаты не совпадут — запишем соответствующее сообщение в переменную $error, блокируя таким образом добавление сообщения. Вот и все :)

      • Мария

        Cпасибо, но вряд ли мне это поможет. Предыдущая капча не продержалась и месяца, так что простую математическую кому-то также не лень будет вскрыть и снова придется потратить массу времени на поиски другого варианта. Вопросы-ответы по крайней мере можно добавлять и изменять, и спамеру надоест заходить все время на сайт и менять вопросы. Думаю, что в моем случае выходом будет прикрыть гостевую книгу до лучших времен.

        • Андрей Кудлай

          Ну, алгоритм, описанный в предыдущем посте, вполне сгодится и для капчи вопрос-ответ.

  15. Жанна

    Как мне нравится этот сайт! Просто находка!

  16. denii

    очень пригодилось!спасибо

  17. Андрей

    Не работает ваша капча ,делал все как написано(капча математического плана) но выдает ошибки

  18. Марат

    Здравствуйте у меня сделано немного по другому!
    Помогите капчу вмонтировать в уже сделанную почтовую форму!
    У меня почтовая форма находится по адресу
    marrex.ru/pochta-1/mail.html
    И второй файл — php обработчик
    marrex.ru/pochta-1/mail2.php
    Спасибо всем заранее!

  19. Вероника

    Андрей, у меня почему-то не работает эта функция: strtolower(trim($_POST['captcha']))
    С чем это может быть связано? Спасибо.

    • Андрей Кудлай

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

  20. Alex

    Хорошая капча для сайта captcha.one

  21. Денис

    А можно для чайника слегка доработать второй вариант капчи, но с помощью таблицы sql? Допустим для двух столбцов «question» и «answer». Самостоятельно не хватает пока мозгу перевести их содержимое в совокупности в массив…
    Заранее спасибо!!!

    • Андрей Кудлай

      Можно, но в рамках комментариев, как Вы понимаете, показать готовое решение проблематично. А суть проста: в таблице три поля: id, question, answer. Запросом получаем случайную строку и выводим вопрос. Ответ записываем в сессию. Далее все по той же схеме. Если будут проблемы с реализацией, тогда задайте вопрос на нашем форуме, выложите свои наработки кода, попробуем что-то конкретное подсказать.

  22. Кирилл

    Здравствуйте! Отличные уроки но у меня чтото работает не так:( Не смотря на то что все логично и понятно.
    Делаю капчу по первому варианту то есть сумма двух чисел, ситуация такова:
    У меня проверка результата происходить по сумме тех чисел, которые выводятся после обновления страницы. Попытаюсь объяснить что это значит:
    Допустим рандом выводит выражение 3+5, я в поле ввожу результат 8, нажимаю кнопку, страница обновляется, появляется новое выражение 7+3 и выдает что результат неверный.
    А если я при том же выражении 3+5 напишу результат 10, то после обновления и появления выражения 7+3 выдаст что результат верный.
    Вот так вот.
    Может это все изза этой проблемы: функции session_start() и header(«Location: index.php») не работают, на странице появляется такое сообщение:
    Warning: session_start() [function.session-start]: Cannot send session cookie — headers already sent by (output started at my\www\index.php:1) in my\www\blocks\say.php on line 32
    Line 32 — это как раз строка с функцией session_start

    • Андрей Кудлай

      Здравствуйте, Кирилл.
      Да, скорее всего проблема именно в этой ошибке. А вот и урок, в котором Вы найдете ответ, как исправить эту ошибку.

  23. Ольга

    Добрый день! подскажите пожалуйста, очень нужно, почему этот код из урока не работает в Chrome? В мозиле и в яндекс браузере работает. В хроме почему-то в сессии и в POST разные значения получаются

    • Андрей Кудлай

      Здравствуйте, Ольга.
      Только что проверил работу в Хроме, у меня проблемы нет. Судя по всему, у тех, кто просмотрел урок и пользуется Хромом — проблем также нет. Если бы было иначе, в комментариях бы уже сказали об этом.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree