CAPTCHA на PHP реализация скрипта каптчи на php


Создаем капчу для сайта

Одним из способов защиты форм от спама может служить капча. Сегодня в статье мы напишем и разберем по пунктам одну из простых реализаций её на PHP.

При написании любого приложения, сначала необходимо наметить его логику. Заключаться она будет в двух файлах:

  1. В первом файле мы будем выводить капчу и проверять её на совпадение;
  2. Во втором файле будет находиться скрипт генерирующий её (капчу).

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

Написание скрипта

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

  1. $count_chars = 7, число символов в капче;
  2. $rand_size = rand(14, 30), случайный размер шрифта;
  3. $rand_angle = rand(0, 45), случайный угол наклона букв;
  4. $x = 20 и $y = 40, координаты букв;
  5. $shift_x = 35, смещение по x.

После того как мы описали переменные можно начинать работать с расширением php_gd2. Первым делом создадим новое изображение из картинки и получим его идентификатор, это будет задний фон нашей капчи.

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

Далее нам нужно сгенерировать случайную строку размером в 7 символов. Для этого можно использовать фикцию uniqid(), которая сама по себе возвращает уникальный id, но для большей уникальности я её оберну ещё в md5() и base64_encode(). В итоге всей этой магии получиться максимально уникальная строка с набором цифр, больших и малых букв. После этого остается обрезать её до нужного нам размера и сохранить в сессию.

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

Для от-рисовки мы будем использовать цикл for. При каждой итерации которого, будет вызваться функция imageTtfText(), смещая символ по координате x.

Картинка готова, теперь её надо передать на страницу, так как мы сгенерировал всё на лету обязательно нужно сообщить браузеру, что это изображение. Сделать это можно при помощи заголовков указав тип файла image/jpeg.

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

Проверка капчи

Выводить сгенерированную картинку мы будем при помощи HTML элемента img, указав в его атрибуте src путь до скрипта.

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

После выводим сообщение в нужном месте.

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

Капча для сайта на php с обновлением

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

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

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

То есть если пользователь ее расшифровать не может, он жмет кнопку «Обновить», проверочный код становится иным. Реализацию именно этого мы и разберем сейчас.

Для начала разберем код генерации капчи.

Мы имеем шрифт по следующему пути: «fonts/verdana.ttf». Далее создадим специальный файл captcha.php с определенным кодом.

По сути, этот скрипт включает в себя три этапа:

  1. Генерация случайной строки и запись ее в сессию.
  2. Рисование изображения.
  3. Отправка заголовка и вывод изображения.

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

Далее следует заняться выводом капчи.


Теперь займемся кнопкой «Обновить». Практически, все, что нам необходимо — обновлять src у тега img. Правда если src постоянно обновлять на «captcha.php», то результата не получится, так как браузер не будет ничего обновлять (он ведь не знает, что изображение по тому же адресу будет уже другой). Поэтому надо обновлять с каким-то случайным GET-параметром.

При нажатии на кнопку «Обновить» у тега img с капчей изменяется атрибут src. Src каждый раз разный. Это на саму капчу никакого влияния не оказывает (если мы этого не захотим, разумеется), но, для браузера это новое изображение, поэтому он его подгружает заново. В captcha.php создается абсолютно новый код, он записывается в сессию заново, заново рисуется картинка и возвращается после в тег img.

Вот так и делается полноценная капча с обновлением. Надеемся, что эта статья вам обязательно поможет.

Captcha PHP: пример скрипта

Captcha PHP представляет собой программу, используемую для проверки того, что человек, а не компьютер, вводит данные. Капчи обычно отображаются в конце онлайн-форм и просят пользователя ввести текст с искаженным изображением. Текст на изображении может маскироваться искаженным шрифтом, волновыми и зигзагообразными линиями и автоматическая программа распознавания не может его выявить. Некоторые Captcha PHP включают в себя функцию аудиального произношения. Тесты Captcha могут остановить 90% хакерских атак, заблокировав программное обеспечение робота и ограничив отправку онлайн-запросов.

Определение

Captcha PHP — это система реагирования на вызовы, предназначенная для дифференциации людей и роботизированных программ. Капча используется в качестве проверок безопасности для предотвращения спамеров и хакеров от использования форм на веб-страницах для вставки вредоносного кода.

Спецификация

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

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

История

Потребность в Captcha PHP родилась еще в 1997 году. В то время поисковая система AltaVista искала способ блокировать автоматическое размещение URL-адресов на платформе, которая искажала алгоритмы ранжирования поисковой системы. Чтобы решить эту проблему, Андрей Бродер, главный ученый AltaVista, разработал алгоритм, который случайно генерировал изображение печатного текста. Хотя компьютеры не могли распознать изображение, люди могли читать сообщение, содержащее изображение и отвечающее соответствующим образом. Бродер и его команда получили патент на эту технологию в апреле 2001 года.

В 2003 году Николас Хоппер, Мануэль Блум, Луис фон Ан из Университета Карнеги-Меллона и Джон Лэнгфорд из IBM разработали алгоритм и придумали термин Captcha. Имя означает абсолютно автоматизированный тест Тьюринга публичного применения для дифференциации людей машин.

PHP — это язык сценариев и интерпретатор, который находится в свободном доступе и используется в основном на веб-серверах Linux. PHP выполняется на сервере, а на клиенте запускается сопоставимая альтернатива JavaScript. Данный язык программирования является альтернативой технологии Microsoft Active Server Page (ASP). Как и в ASP, PHP-скрипт Captcha встраивается в веб-страницу вместе с HTML-кодом. Перед отправкой страницы пользователю веб-сервер вызывает PHP для интерпретации и выполнения операций, вызванных в скрипте.

HTML-странице, содержащей PHP-скрипт, обычно присваивается суффикс имени файла .php — «.php7» или «.phtml». PHP можно рассматривать как «динамические HTML-страницы», поскольку контент будет зависеть от результатов интерпретации сценария.

Язык бесплатный и используется по лицензии с открытым исходным кодом.

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

. PHP отлично подходит для создания веб-сайтов, управляемых базами данных.

Как работает Captcha на PHP

Captcha — это своего рода тест Тьюринга. Суть заключается в том, что конечным пользователям предлагается выполнить некоторые задачи, которые программный бот выполнить не сможет. Тесты часто связаны с изображениями JPEG или GIF, потому что, хотя боты и могут идентифицировать наличие изображения, читая исходный код, они не могут распознать содержание картинки. Поскольку некоторые изображения трудно интерпретировать, пользователям обычно предоставляется возможность запросить новый тест.

Классификация

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

Распознавание изображений Captcha в PHP, которые также широко используются, просят пользователей идентифицировать подмножество картинок в большом наборе изображений. Например, пользователю может быть представлен набор иконок, и предлагается нажать на все те, в которых есть автомобили.

Другие типы Captcha включают:

  • Math Captcha — требует от пользователя решения основной математической задачи, такой как добавление или вычитание двух чисел.
  • 3D Super Captcha — здесь пользователь должен идентифицировать изображение, отображаемое в 3D.
  • I’m Not a Robot — в этом типе капчи пользователь должен установить флажок.
  • Marketing — требует от пользователя ввода определенного слова или фразы, относящейся к бренду спонсора.

Обход капчи: обзор последних расширений

Пользователи могут использовать расширения из надстроек браузера, которые позволяют пользователям обходить ввод капчи. Популярные надстройки браузера включают AntiCapture, Captcha Be Gone и Rumola.

Автоматический плагин AntiCaptcha для Chrome и Firefox автоматически находит plugins captcha recaptcha recaptcha php на веб-странице и обрабатывает ее для пользователя. Приложение не бесплатное: на момент написания этой статьи стоимость услуги начинается с 0,70 доллара за 1000 изображений Captcha. Расширение Captcha Be Gone обнаруживает капчу на веб-страницах, обрабатывает ее и копирует результат в буфер обмена пользователя. На данный момент утилита доступна для браузеров Firefox, Chrome и Internet Explorer за подписку в размере 3,50 долларов США в месяц.

Приложение Rumola для Firefox, Chrome и Safari автоматически ищет Captcha на веб-страницах, которые посещает пользователь. В настоящее время стоимость составляет 0,95 $ для 50 изображений капчи или 1,95 $ для 150 решений. У данного разработчика также есть букмарклет JavaScript, который можно использовать для устройств, подключающихся к Интернету.

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

Как открыть Captcha PHP: пример

Представленный ниже код показывает, как создать простую графику Captcha со случайными строками и цифрами и как включить ее в HTML-форму для предотвращения автоматической подачи вредоносных скриптов. Также это поможет ответить на вопрос: как открыть plugins captcha recaptcha recaptcha php?

Следующий код необходимо сохранить как отдельный файл PHP (мы называем его Captcha /php). Этот файл создает PNG-изображение, содержащее серию из пяти цифр. Он также сохраняет эти цифры в переменной сеанса, чтобы другие скрипты могли знать, что такое правильный код, и проверить правильность ввода.


Пример Captcha PHP script

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

Полученное в результате обработки скрипта (Captcha PHP ajax) изображение должно быть трудным для «роботов», но максимально простым для людей. При желании вы можете усложнить графику, добавив цвета или текстуры, либо используя разные шрифты и эффект вращения.

Альтернативные схемы

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

  • Компания Chew опубликовала свою работу на 7-й Международной конференции по информационной безопасности ISC’04, предложив три различные версии распознавания образов капчи, и подтвердила эту гипотезу с помощью пользовательских исследований.
  • Организация Datta опубликовала свою работу на конференции ACM Multimedia ’05, под названием IMAGINATION, предлагая систематический способ распознавания изображений Captcha. Картинки искажаются таким образом, что современные подходы к распознаванию изображений (которые являются потенциальными технологиями атаки) не распознают их.
  • Инженеры ИТ-гиганта Microsoft (Джереми Элсон, Джон Р. Дузер, Джон Хауэлл и Джаред Саул) разработали распознавание изображений видов животных для ограничения доступа (ASIRRA), которые просят пользователей различать кошек и собак. У Microsoft была бета-версия этого решения для использования веб-сайтами. Тесты показали, что люди успешно распознавали изображения в 99,6% случаев за 30 секунд. Это решение было описано в документе 2007 года к материалам 14-й конференции ACM по безопасности компьютеров и коммуникаций (CCS).
Илон Маск рекомендует:  Что такое код sesam_errormsg

В чем разница между Captcha и reCaptcha?

Captcha — это тест на проверку личности (обычно это размытые буквы, которые необходимо расшифровать), используемые многими сайтами для предотвращения спама.

ReCaptcha — это обратная Captcha. Тот же тест, который используется не только для предотвращения спама, но и для помощи в проекте по цифровому изданию. Другими словами, тесты Recaptcha — это не бессмысленная комбинация слов, а выдержки из книг, в то время как Captcha использует несколько методов проверки личности, включая математические или общие вопросы, визуальные и шахматные головоломки.

В настоящее время reCaptcha является наиболее популярной реализацией.

Применение

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

  • Перечисления (формы регистрации или сброса пароля часто уязвимы для атак злоумышленников — без Captcha хакер может получить действительные имена пользователей, номера телефонов или любую другую конфиденциальную информацию за короткое время).
  • Автоматическая отправка многих запросов GET/POST за короткое время, когда это нежелательно (например, получение SMS/MMS/электронной почты). В данном случае Captcha обеспечивает функцию ограничения скорости.
  • Автоматическое создание учетной записи, которая должна использоваться только людьми (например, создание учетных записей электронной почты, остановка спама).
  • Автоматическое размещение постов в блогах, форумах и вики-ресурсах.
  • Любые автоматические атаки, которые в массовом порядке получают или злоупотребляют конфиденциальной информацией из приложения.

Использование Captcha в качестве защиты от межсайтовой подделки запроса не рекомендуется, так как существуют более сильные контрмеры.

Создание каптчи своими руками на PHP

Мы все с вами привыкли видеть на сайтах при заполнении любой формы трудночитаемую картинку с рандомными символами и цифрами. Данная картинка называется КАПТЧА (от CAPTCHA— англ. Completely Automated Public Turing test to tell Computers and Humans Apart — полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей). Как описано в расшифровке аббревиатуры данная картинка позволяет определить робот или человек заполняет форму.

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

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

Переходя от вступления к практики, для написания КАПТЧИ нам понадобится библиотека GD. GD Graphics Library (GD) — программная библиотека, написанная Томасом Баутелом (Thomas Boutell) и другими разработчиками для динамической работы с изображениями. Данная библиотека работает с множеством других языков программирования и служит для работы с графикой. Как вы уже догадались, мы будем с помощью библиотеки GD и PHP создавать свою картинку с рандомным текстом. Graphics Library позволяет также редактировать существующие изображения, а именно наложение логотипа на картинку, изменения размеров загружаемого изображения и многое другое.

  • gd_info — Вывод информации о текущей установленной GD библиотеке
  • getimagesize — Получение размера изображения
  • getimagesizefromstring — Получение размера изображения из строки данных
  • image_type_to_extension — Получение расширения файла для типа изображения
  • image_type_to_mime_type — Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
  • image2wbmp — Выводит изображение в браузер или пишет в файл
  • imageaffine — Return an image containing the affine transformed src image, using an optional clipping area
  • imageaffinematrixconcat — Concatenate two affine transformation matrices

  • imageaffinematrixget — Get an affine transformation matrix
  • imagealphablending — Задание режима сопряжения цветов для изображения
  • imageantialias — Требуется ли применять функции сглаживания или нет
  • imagearc — Рисование дуги
  • imagechar — Рисование символа по горизонтали
  • imagecharup — Рисование символа вертикально
  • imagecolorallocate — Создание цвета для изображения
  • imagecolorallocatealpha — Создание цвета для изображения
  • imagecolorat — Получение индекса цвета пиксела
  • imagecolorclosest — Получение индекса цвета ближайшего к заданному
  • imagecolorclosestalpha — Получение индекса цвета ближайшего к заданному с учетом прозрачности
  • imagecolorclosesthwb — Получение индекса цвета, имеющего заданный тон, белизну и затемнение
  • imagecolordeallocate — Разрыв ассоциации переменной с цветом для заданного изображения
  • imagecolorexact — Получение индекса заданного цвета
  • imagecolorexactalpha — Получение индекса заданного цвета и альфа компонента
  • imagecolormatch — Делает цвета палитровой версии изображения более соответствующими truecolor версии
  • imagecolorresolve — Получает идентификатор конкретного цвета или его ближайший аналог
  • imagecolorresolvealpha — Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог
  • imagecolorset — Установка набора цветов для заданного индекса палитры
  • imagecolorsforindex — Получение цветов, соответствующих индексу
  • imagecolorstotal — Определение количества цветов в палитре изображения
  • imagecolortransparent — Определяет цвет как прозрачный
  • imageconvolution — Наложение искривляющей матрицы 3х3, используя коэффициент и смещение
  • imagecopy — Копирование части изображения
  • imagecopymerge — Копирует часть изображения с наложением
  • imagecopymergegray — Копирует часть изображения с наложением в градациях серого
  • imagecopyresampled — Копирование и изменение размера изображения с ресемплированием
  • imagecopyresized — Копирование и изменение размера части изображения
  • imagecreate — Создание нового палитрового изображения
  • imagecreatefromgd2 — Создание нового изображения на основе GD2 или URL
  • imagecreatefromgd2part — Создание нового изображения на основе части GD2 файла или URL
  • imagecreatefromgd — Создание нового изображения на основе GD файла или URL
  • imagecreatefromgif — Создает новое изображение из файла или URL
  • imagecreatefromjpeg — Создает новое изображение из файла или URL

  • imagecreatefrompng — Создает новое изображение из файла или URL
  • imagecreatefromstring — Создание нового изображения из потока представленного строкой
  • imagecreatefromwbmp — Создает новое изображение из файла или URL
  • imagecreatefromwebp — Создает новое изображение из файла или URL
  • imagecreatefromxbm — Создает новое изображение из файла или URL
  • imagecreatefromxpm — Создает новое изображение из файла или URL
  • imagecreatetruecolor — Создание нового полноцветного изображения
  • imagecrop — Crop an image using the given coordinates and size, x, y, width and height
  • imagecropauto — Crop an image automatically using one of the available modes
  • imagedashedline — Рисование пунктирной линии
  • imagedestroy — Уничтожение изображения
  • imageellipse — Рисование эллипса
  • imagefill — Заливка
  • imagefilledarc — Рисование и заливка дуги
  • imagefilledellipse — Рисование закрашенного эллипса
  • imagefilledpolygon — Рисование закрашенного многоугольника
  • imagefilledrectangle — Рисование закрашенного прямоугольника
  • imagefilltoborder — Заливка цветом
  • imagefilter — Применяет фильтр к изображению
  • imageflip — Flips an image using a given mode
  • imagefontheight — Получение высоты шрифта
  • imagefontwidth — Получение ширины шрифта
  • imageftbbox — Определение границ текста выводимого шрифтом freetype2
  • imagefttext — Нанесение текста на изображение, используя шрифты FreeType 2
  • imagegammacorrect — Применение гамма коррекции к GD изображению
  • imagegd2 — Вывод GD2 изображения в браузер или файл
  • imagegd — Вывод GD-изображения в браузер или в файл
  • imagegetclip — Get the clipping rectangle
  • imagegif — Выводит изображение в браузер или пишет в файл
  • imagegrabscreen — Захватывает изображение с экрана
  • imagegrabwindow — Захватывает изображение окна
  • imageinterlace — Включение или выключение интерлейсинга
  • imageistruecolor — Определяет, является ли изображение полноцветным

  • imagejpeg — Выводит изображение в браузер или пишет в файл
  • imagelayereffect — Установка флага альфа сопряжения для использования эффектов наложения изображений
  • imageline — Рисование линии
  • imageloadfont — Загрузка шрифта
  • imagepalettecopy — Копирование палитры из одного изображения в другое
  • imagepalettetotruecolor — Converts a palette based image to true color
  • imagepng — Вывод PNG изображения в браузер или файл
  • imagepolygon — Рисование многоугольника
  • imagepsbbox — Выдает параметры рамки, обрамляющей текст написанный шрифтом PostScript Type1
  • imagepsencodefont — Изменение вектора кодировки шрифта
  • imagepsextendfont — Растягивание или сжатие шрифта
  • imagepsfreefont — Освобождение памяти, занятой шрифтом PostScript Type
  • imagepsloadfont — Загрузка шрифта PostScript Type 1 из файла
  • imagepsslantfont — Наклон шрифта
  • imagepstext — Рисование текста поверх изображения, используя шрифты PostScript Type1
  • imagerectangle — Рисование прямоугольника
  • imagerotate — Поворот изображения с заданным углом
  • imagesavealpha — Установка флага сохранения всей информации альфа компонента (в противовес одноцветной прозрачности) и сохранение PNG изобаржения
  • imagescale — Scale an image using the given new width and height
  • imagesetbrush — Установка изображения (кисти), посредством которого будут рисоваться линии
  • imagesetclip — Set the clipping rectangle
  • imagesetinterpolation — Set the interpolation method
  • imagesetpixel — Рисование точки
  • imagesetstyle — Установка стиля рисования линий
  • imagesetthickness — Установка толщины линий
  • imagesettile — Установка изображения, которое будет использовано в качестве элемента мозаичной заливки
  • imagestring — Рисование строки текста горизонтально
  • imagestringup — Рисование строки текста вертикально
  • imagesx — Получение ширины изображения
  • imagesy — Получение высоты изображения
  • imagetruecolortopalette — Преобразование полноцветного изображения в палитровое
  • imagettfbbox — Получение параметров рамки обрамляющей текст написанный TrueType шрифтом
  • imagettftext — Рисование текста на изображении шрифтом TrueType
  • imagetypes — Возвращает список типов изображений, поддерживаемых PHP сборкой

  • imagewbmp — Выводит изображение в браузер или пишет в файл
  • imagewebp — Output a WebP image to browser or file
  • imagexbm — Вывод XBM изображения в браузер или файл
  • iptcembed — Встраивание двоичных IPTC данных в JPEG изображение
  • iptcparse — Разбор двоичных IPTC данных на отдельные тэги
  • jpeg2wbmp — Конвертирует изображение из формата JPEG в WBMP
  • png2wbmp — Преобразование PNG файла в WBMP

Определим требования к нашей КАПТЧе для ее реализации:

  • Размер холста 200 х 60
  • Фон холста RGB(255, 181, 181)
  • Шрифт verdana.ttf
  • Рандомные лини на холсте с рандомным цветом
  • Генератор строки для КАПТЧИ
  • Рандомный цвет символов и углом наклона
  • Рандомное количество и цвет точек на холсте
  • Обновление КАПТЧИ без перезагрузки страницы (Jquery)
  • КАПТЧА чувствительна к регистру
  • Плашка с URL нашего сайта

Приступаем к написанию КАПТЧИ. Первое что нам нужно – это генератор случайных чисел. Такой генератор я писал в одной из статей Генератор пароля + соль в пароле для хранения в MySQL. Так же необходимо загрузить файл шрифта на сервер для использования его в КАПТЧе.

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

Генерация изображения со случайным кодом (captcha)

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

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

Через HTML такое изображение вызывается стандартно:

Скачать скрипт генерации защитного кода с полным набором символов и возможностью подключения своих шрифтов можно здесь secpic.zip

98 Комментарии “ Генерация изображения со случайным кодом (captcha) ”

Картинка хорошая, спасибо.Только объясните, пожалуйста, как принимающий скрипт узнает, что на ней нарисовано?

через переменную сессии.когда генерируем изображение — $_SESSION[‘secpic’] = implode(»,$cod);когда проверяем — if($_SESSION[‘secpic’]==strtolower($_POST[‘secpic’]))

Отличный скрипт,большое спасибо

в скрипте отличные буквы, мне оч понравился, а если еще и заработает у меня вообще отлично будет


Спасибо. СимпотишЫне картинки. Будем ща прикручивать к фидбэку. Спасиб автору ��

Спасибо! Так лень было самому писать))

Вставляю следующий код на свою страницу:
echo ‘ ‘;
echo

У меня тоже самое, что и у DRONNY!
Объясните плиз!

в captcha.php вместо $cod = implode(«»,$cod); надо написать $_SESSION[‘secpic’] = implode(»,$cod);
выведите на экран $_SESSION[‘secpic’] и $_POST[«secpic»], посмотрите что в них и будет вам счастье …

Разобрался!
В самое начало страницы нужно воткнуть начало сессии!

Эмммм. А кто подскажет.
На Denwer капча работает нормально, а вот на сервере (CentOS)Apache не рисуется!
В чем проблема и как можно исправить?!

to CaTacLYSM: проверяйте правильность установки GD библиотеки на сервере

Alek, молодец!) Кульный скрипт

У Вас очень простые и талантливые идеи, спасибо. Вашу captcha прикрутил на свой сайт. До этого использовал вот это: recaptcha.net/plugins/php Идея там конечно хорошая, но это использование стороннего API, а это не всегда показано и слишком уж наворочено. Если надо создать лишнею проблему пользователю, то да, если надо создать некое препятствия для спам ботов, то не подойдет. Идеален в этом случаи Ваш скрипт. Не могли бы Вы ответить мне на вопрос: как Вы отлаживаете javascript скрипты? Так смотришь скрипт, вроде все элементарно, как начнешь отладку, так темный лес. По этому, по возможности, все реализую в «серверном варианте» на PHP, по крайней мере методом «научного тыка» (ошибки ведь сразу видно) удается более менее быстро написать скрипт. Хотя возможностей того же PHP стало не хватать и надоело воровать чужие скрипты на javascript. C уважением Сергей.

Илон Маск рекомендует:  Псевдоэлементы after и before

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

добавляй случайный GET параметр к ссылке, что-нибудь типа /captcha.php?rand=1234, чтобы браузер и прокси не кешировали.

Здравствуйте ! Не совсем мне понятно, пожалуйста объясните пожалуйста для тех кто в танке, для чего надо стартовать новую сессию, если старт таковой уже прописан в Вашем скрипте… пробовал считывать переменную таким образом как написано выше: if($_SESSION[‘secpic’] == strtolower($_POST[‘pic’])) получал неправильный ответ иди Unknow wariable _SESSION[‘secpic’]

Сессию, конечно, надо только один раз стартовать там, где это логично. Скрипт из архива можно использовать «как есть», поэтому там сессия стартуется. Если получаете неправильный ответ, а особенно Unknow wariable — включайте error_reporting(E_ALL) и проверяйте правильно ли стартована сессия там, где это получаете.

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

Картинки замечательные. К генератору никаких замечаний, всё работает, однако передачу значения кода с картинки через переменную сессии осуществить не удалось. Если можете, разъясните подробнее на рабочем примере «Форма+капча+обработчик формы и кода»

Таки заработало! 1. Включить куки (не уверен что нужно, но читал. что без этого может не работать); 2. Удалить из браузера всю историю, куки, посещённые адреса, кеш, можно отключить кеширование страниц и т.д.(пароли оставляем:)); 3. session_star() пишем как в обработчеке формы, так и в скрипте генерации изображения. 4. Открываем «почищенный» браузер, а лучше какой-нибудь свежеустановленный альтернативный и пробуем там — должно заработать!

Здравствуйте! Сделал все как тут, картинка генерируется, но проблема вот в чем: путаюсь на той же странице вывести из сессии ТЕКСТ картинки, а он выводит почему то СТАРЫЙ, а не тот который сейчас на картинке. Да и еще при первом запуске браузера он вообще бьет ошибку на строку вывода, а когда обновляю страницу то уже выводит. но выводит текст с предыдущей картинки.

А вот код, как я это делаю:

У меня проблемка, скрипт иногда выводит на картинку одно, а в переменную сессии другое, в чём может быть дело? Кэширование точно не причем. После чистки всего, кэша, истории и кук, тестил на чистом браузере…

День добрый! Присоединяюсь к Александру. Тоже самое. Бьюсь второй день. Есть несовпадение с тем, что на картинке и с тем, что выводит $_SESSION[‘secpic’]. В этой сессионной переменной почему то всегда значение которое было на предыдущей капче. Самое интересное что значения $_SESSION[‘secpic’] в скрипте моем, куда вставлена проверка и в скрипте который строит саму капчу (тот что в шапке этой статьи) РАЗНЫЕ. я это выяснил, когда добавил отсылку значения $_SESSION[‘secpic’] к себе на е-майл. Получилось что $_SESSION[‘secpic’] внутри скрипта построения капчи имеет ВЕРНОЕ значение (что и на текущей картинке), а при проверке и вызове этой переменной в своем скрипте, НЕВЕРНОЕ (предыдущее значение капчи). Помогите разобраться пожалуйста!

Скрипт и капча просто супер. Что бы все заработало нужно в принимающем файле вписать следующее. $a = $_SESSION[‘secpic’]; $a = strtolower($a); $b = $_POST[‘test’]; $b = strtolower($b); $b = trim($b); echo «В переменной а содержится: «.$a; echo «
«; echo «В переменной b содержится: «.$b; echo «
«; if ($a == $b) < echo "куль"; >else < echo "некуль"; >?>

Цитата: «У меня проблемка, скрипт иногда выводит на картинку одно, а в переменную сессии другое, в чём может быть дело?» Извиняюсь забыл уточнить, када писал это сообщение, что использовал русский алфавит, и вот он та даёт осечку такого типа. Как мне кажется эта проблема кроется в генераторе картинки. Где буквы в цикле перебираются. При использовании английских символов осечек нету, у меня точно. Set, на счёт вашего варианта попробую, может сканает �� В чём суть моей проблемы, я хочу замутить капчу на русском, пока не решил проблему…

Здравствуйте. У меня возникла такая вот проблемка. На денвере все хорошо скрипт отрабатывается и картинка выводиться, а при переносе на хостинг скрипт перестает генерировать изображение. Подскажите плиз в чем это может быть проблема.

У меня вообще выводится только альтернативный текст — подключиться к файлу никак не может

Подскажите как сделать поле куда вписывать код

Хорошая капча. Автору спасибо!

Как обновить картинку с новым кодом капTча ?

Чтобы обновить изображение:

Аналогичная проблема с сессией. Переменная сессии показывает предыдущее значение с картинки.

в каптче сессия должна стартовать session_start(); а также сессия должна стартовать в Вашем php скрипте session_start(); в скрипте — обработчике сравниваем значения $_SESSION[‘secpic’] и $_POST[‘captcha’] if ($_POST[‘captcha’] != $_SESSION[‘secpic’] OR !$_SESSION[‘secpic’]) echo ‘error’; else echo ‘good’;

Как перегрузить средствами php или js исходный файл(secpic.php), чтобы тот файл к которому прикручена капча не перегружался. Попробовал функцию в сообщении от 08.04.11 — не работает.

не дописал 1 строку, чтобы работало нужно заменить в сообщении от 08.04 на


Автору — опишите пожалуйста как Вы реализовали проверку на ввод защитного кода «Неправильный защитный код!».

Неплохо было бы автору обновить исходник и код вверху добавив к нему предоставленную возможность обнавления (очень полезная штука) но всеравно обоим авторам спс за скрипт

Отличный скрипт, спасибо.

Privet Alek, deistvitelno tvoi skript o4eni horoshii, genialnii i prostoi :). Spasibo bolishoe, ia nemnoshko ego dorobotal zdelav ego dinami4nee. Kak mne postaviti zdesi moiu dorobotku?

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

Вообще неработает, непонятно, у меня фотрма работает вообще то даже если я вообще не введу код с картинки о_______________________О помогите ��

Не работает, на картинке и в переменной разные символы…:((

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

Спасибо то что нужно я немного переделал его //набор символов $letters = «aeioubcdfghjklmnpqrstvwxyz0123456789»; //а строку где идет выборка символов //случайный символ $letter = $letters; а так то то нужно сэкономило мне время, не потомучто это сложно просто это готовое решение мне понравилось Спасибо автор!

Такой вопрос: как можно увеличить контрастность выводимых символов на картинке к примеру символы в фоне покрасить черным цветом а нужные для проверки сделать поярче

Цвета букв задаются как RGB тремя числами от 0 до 255. Для фона они выбираются случайно в строке 20, для основных задаются варианты потемнее в строке 11. И то и другое, естественно, можно поменять.

Спасибо хороший скрипт!

Спасибо! Целый день искал наконец нашел, установился без проблем

Можно еще и фон поменять, супер то что надо

Обалденный скрипт :))) Спасибо большое автору, все просто и без гемороя. и главное работает :))

Применил данный пример, очень доволен, спасибо. Заставить работать обновление картинки из постов от 08.04.11 и 24.04.11 не получилось Зато я сочинил еще один похожий вариант с использованием библиотеки jQuery, который заработал у меня:

Блин криво скопировался текст, в последней строке функции надо добавить аппендТу: $(» «).appendTo(«.captcha»);

Автор, большие благодарности за код! Работает идеально. Просто, стильно и со вкусом! Кликнул по рекламе ��

Fatal error: Call to undefined function imagecreatetruecolor() in F:serverwwwtestcommentssecpic.php on line 14 В моем php что нету такой функции?

ну так и было, GD2 не было подключено! Спасибо за скрипт!

в сессии находится предыдущие значение картинки,как быть? только сравниваю не с с элементом массива post а то что введено в строку

Прекрасный скрипт. Но при использовании все равно валила куча спама пока в сессии не начал передавать не сам код в открытом виде, а md5 хэш. Видимо спам боты могут считывать переменные из сессии.

Скрипт супер, спасибо, единственный трабл, ввожу все правельно, а пишет Регистрация невозможна: код подтверждения введен не верно Из-за чего это?

Подскажите пожалуйста. Как проверить $_SESSION[‘secpic’] на той же странице на которую выводим капчу (например явой). Ведь в этом случае переменная методом POST не передается и соответственно $_POST[‘secpic’] не существует и сравнивать переменную сессии не с чем.

Кстати код выбора шрифтов из папки можно упростить и улучшить, вместо: $fonts = array(); $dir=opendir($path_fonts); while($fontName = readdir($dir)) < if($fontName != "." && $fontName != "..") < $fonts[] = $fontName; >> closedir($dir); можно сделать так: $fonts = glob(‘fonts/*.ttf’, GLOB_NOSORT); это будет полезно например если в папке со шрифтами у вас например лежит еще и .htaccess или другие файлы, так как в таком виде скрипт будет искать и использовать только файлы .ttf а не все подряд.

А для обновления именно этой капчи без перезагрузки страницы я использую этот простейший JavaScript код: Не забывайте также экранировать кавычки если у вас ошибки php возникают, вот так например

Обратные слэши тут в комментариях вырезаются поэтому второй код без экранирования тоже))) Ну думаю разобраться сможете)

Здравствуйте. А как можно передать данные случайной строки в captcha.php , или забрать оттуда , если session не используется ,отключены куки? послать их при вызове GET? captcha.php/?randstr= ? это безопасно ? по другому нельзя ?

Код рабочий для тех у кого ручки не оттуда вот мной подправленный исходник

А код формирования каптчи в начале каптчи стартует сесия session_start(); и дальше под конец файла меняем исходник автора на вот эту бугульму $_SESSION[‘secpic’] = implode(«»,$cod); //переводим код в строку

Автору спасибо:) Кликнул по рекламке:)

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

CAPTCHA на PHP: реализация скрипта каптчи на php

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

Прежде всего следует понимать что капча которую мы будем делать представляет собой картинку (png, jpg или gif) на которой изображен шифр(код ) который необходимо ввести пользователю.

Рассмотрим подробнее на форме авторизации, cоздадим три файла:

index.php — Файл с формой авторизации

login.php — Файл с обработчиком

сaptcha.php — файл генерирующий капчу

В файле index.php

Как видите здесь ничего сложного нет, в качестве пути к картинке мы используем путь к файлу captcha.php

В файле обработчике login.php

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

И так, давайте теперь разберемся с содержимым файла captcha.php, здесь нам необходимо сгенерировать изображение с помощью php:

Первое что мы делаем:

Создаем дескриптор изображения, задаем размеры и делаем фон:

$img — дескритор изображения,; 130,24 — ширина и высота; 0,0 — координаты начала заливки; 0xFFFFFF — белый цвет данная запись эквивалентна (#fffff)

Едем дальше и создадим четыре переменных:

$x = 0;//Координата x символа

$i = 1;//Координата y символа

$str = «abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789»;//варианты символы которые будут присутствовать в нашем коде

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

смотрим что у нас тут получилось.

imagettftext — эта функция отвечает за генерацию текста с расширением ttf на изображении.

imagettftext (Дескриптор изображения, Размер текста, Угол наклона текста, Координата текста по X, Координата текста по Y, Цвет текста, Шрифт текста, текст);

Цвет текста генерируется с помощью функции imagecoloralLocate которой передается дескриптор изображения и три числовых параметра rgb.

Следует еще заметить что нам нужен шрифт с расширением ttf, в нашем случае это verdana.ttf поэтому вы должны закинуть этот шрифт рядом с файлом captcha.php или прописать до него путь.

Как видите на каждой итерации цикла у нас генерируется случайный символ из строки srt и с помощью функции rand() генерируются случайные величины параметров в определенных интервалах.

Все символы записываются:

imageline — Функция которая рисует линию в качестве аргументов принимаются дескриптор изображения, начальная и конечная координаты x, y; цвет линий.

Линии я использовал в качестве так называемого шумового эффекта.

Илон Маск рекомендует:  Модульная сетка

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

Полный код файла captcha.php будет выглдеть так:

Теперь проверяем как все работает. Заходим в файл index.php, где находиться наша форма авторизации . Там должна генерироваться наша картинка с проверочным кодом. Вводим произвольные данные и проверочный код с картинки. В результате если код введен верно должно отобразиться сообщение что форма отправлена.

Проверочный код предназначен прежде всего для безопасности: защиты от спама и флуда и т.п. Поэтому лучше такой мерой защиты не пренебрегать!

На этом дорогие друзья данная статья подошла к концу, скажу на последок что google предлагает возможность использования своей капчи ‘Я не робот’ или recaptcha .

А на этом все. Я надеюсь данная статья была для вас содержательна и полезна. Удачи!

CAPTCHA на PHP: реализация скрипта каптчи на php

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

Прежде всего следует понимать что капча которую мы будем делать представляет собой картинку (png, jpg или gif) на которой изображен шифр(код ) который необходимо ввести пользователю.

Рассмотрим подробнее на форме авторизации, cоздадим три файла:

index.php — Файл с формой авторизации

login.php — Файл с обработчиком

сaptcha.php — файл генерирующий капчу

В файле index.php

Как видите здесь ничего сложного нет, в качестве пути к картинке мы используем путь к файлу captcha.php

В файле обработчике login.php

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

И так, давайте теперь разберемся с содержимым файла captcha.php, здесь нам необходимо сгенерировать изображение с помощью php:

Первое что мы делаем:

Создаем дескриптор изображения, задаем размеры и делаем фон:

$img — дескритор изображения,; 130,24 — ширина и высота; 0,0 — координаты начала заливки; 0xFFFFFF — белый цвет данная запись эквивалентна (#fffff)

Едем дальше и создадим четыре переменных:

$x = 0;//Координата x символа

$i = 1;//Координата y символа

$str = «abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789»;//варианты символы которые будут присутствовать в нашем коде

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

смотрим что у нас тут получилось.

imagettftext — эта функция отвечает за генерацию текста с расширением ttf на изображении.

imagettftext (Дескриптор изображения, Размер текста, Угол наклона текста, Координата текста по X, Координата текста по Y, Цвет текста, Шрифт текста, текст);

Цвет текста генерируется с помощью функции imagecoloralLocate которой передается дескриптор изображения и три числовых параметра rgb.

Следует еще заметить что нам нужен шрифт с расширением ttf, в нашем случае это verdana.ttf поэтому вы должны закинуть этот шрифт рядом с файлом captcha.php или прописать до него путь.

Как видите на каждой итерации цикла у нас генерируется случайный символ из строки srt и с помощью функции rand() генерируются случайные величины параметров в определенных интервалах.

Все символы записываются:

imageline — Функция которая рисует линию в качестве аргументов принимаются дескриптор изображения, начальная и конечная координаты x, y; цвет линий.

Линии я использовал в качестве так называемого шумового эффекта.

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

Полный код файла captcha.php будет выглдеть так:

Теперь проверяем как все работает. Заходим в файл index.php, где находиться наша форма авторизации . Там должна генерироваться наша картинка с проверочным кодом. Вводим произвольные данные и проверочный код с картинки. В результате если код введен верно должно отобразиться сообщение что форма отправлена.

Проверочный код предназначен прежде всего для безопасности: защиты от спама и флуда и т.п. Поэтому лучше такой мерой защиты не пренебрегать!

На этом дорогие друзья данная статья подошла к концу, скажу на последок что google предлагает возможность использования своей капчи ‘Я не робот’ или recaptcha .

А на этом все. Я надеюсь данная статья была для вас содержательна и полезна. Удачи!

Создание капчи (captcha) на PHP

Замечания

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

Капча (captcha) представляет из себя изображение с некоторым текстом, который предлагается набрать пользователю в поле ввода для подтверждения его «человечности». Дело в том, что человеку одинаково легко читать текст, независимо от того, является ли он непосредственно машинным текстом или изображением. В то время как компьютеру требуется гораздо более сложный алгоритм для «чтения» текста в виде картинки. Очевидно, что капча каждый раз должна отображать случайную последовательность символов.

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

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

Обратите внимание, что для работы скрипта требуется PHP-расширение GD, подключите его в настройках.

Для начала необходимо определиться со шрифтом. Соответствующий выбранному шрифту ttf-файл необходимо положить в директорию с будущим скриптом капчи. Я для капчи выбрал шрифт Comic Sans MS, ему соответствует файл comic.ttf. Файлы шрифтов можно найти в системном каталоге шрифтов вашей операционной системы, либо загрузить из Интернета.

Далее создается скрипт captcha.php. В начале скрипта объявляются необходимые переменные:

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

В этой переменной задается длина капчи (6 символов).

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

Здесь указывается файл шрифта. В принципе, его можно разместить в поддиректории, допустим, fonts, тогда содержимое переменной должно быть такого формата: fonts/comic.ttf.

С переменными разобрались. Далее, приступаем непосредственно к реализации. Во-первых, необходимо указать клиенту запрошенного скрипта, что ответный контент представляет из себя не текст, а изображение. Для этого переопределяем содержимое HTTP-заголовка content-type:

Создаем изображение с заданными размерами:

Выставляем флаг необходимости сохранения альфа-канала изображения:

Создаем цвет фона. Это будет полностью прозрачный цвет:

Заливаем этим цветом наше созданное изображение:

Этими действиями мы подготовили наше изображение для наложения на него капчи. Следующая строка необходима не всегда, зависит от настроек веб-сервера. Она переопределяет путь к поиску шрифтов. Оставьте ее закомментированной, если вдруг капча не будет формироваться при тестировании, а в логе ошибок Apache будет появляться ошибка «imagettftext(): Could not find/open font», попробуйте ее раскомментировать:

Инициализируем переменную, в которой будет содержаться текстовое значение капчи:

Далее организовывается цикл с количеством итераций равным длине капчи (caplen):

На каждом шаге цикла генерируется очередной символ капчи и рисуется на изображении. Берем случайный символ из нашего алфавита и добавляем его в капчу:

Вычисляем положение сгенерированного символа на изображении по оси x:

Это положение зависит от ширины изображения, длины капчи и порядкового номера символа. Далее мы добавляем немного «случайности» в это положение:

Вычисляем положение сгенерированного символа на изображении по оси y:

Положение зависит от размера шрифта и высоты изображения.

Генерируем случайный цвет для символа. Этот цвет не должен быть слишком светлым, поэтому каждый из компонентов цвета (R, G и B) генерируем в диапазоне 0-100:

Для текущего символа случайным образом генерируем его угол наклона в диапазоне -25..25 градусов, чтобы буквы на капче «плясали»:

И, наконец, рисуем символ со всеми выше полученными характеристиками на изображении:

На этой строке оканчивается тело цикла. Когда цикл отработает, в переменной captcha будет содержаться текстовое значение капчи, а изображение im будет представлять из себя отрисованную капчу. Необходимо где-то сохранить значение капчи, чтобы основной скрипт, который использует ее, мог проверить значение пользователя. Лучшее для этого место — сессионная переменная. Инициализируем сессию и сохраняем значение капчи:

Наконец, выводим сформированное изображение captcha:

И освобождаем память, выведенную под изображение:

Ниже вы можете увидеть демонстрацию работы полученной капчи (попробуйте обновить изображение):

Чуть позже добавлю готовый скрипт капчи и пример его использования в HTML-формах.

Капча для сайта на php с обновлением

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

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

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

То есть если пользователь ее расшифровать не может, он жмет кнопку «Обновить», проверочный код становится иным. Реализацию именно этого мы и разберем сейчас.

Для начала разберем код генерации капчи.

Мы имеем шрифт по следующему пути: «fonts/verdana.ttf». Далее создадим специальный файл captcha.php с определенным кодом.

По сути, этот скрипт включает в себя три этапа:

  1. Генерация случайной строки и запись ее в сессию.
  2. Рисование изображения.
  3. Отправка заголовка и вывод изображения.

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

Далее следует заняться выводом капчи.

Теперь займемся кнопкой «Обновить». Практически, все, что нам необходимо — обновлять src у тега img. Правда если src постоянно обновлять на «captcha.php», то результата не получится, так как браузер не будет ничего обновлять (он ведь не знает, что изображение по тому же адресу будет уже другой). Поэтому надо обновлять с каким-то случайным GET-параметром.

При нажатии на кнопку «Обновить» у тега img с капчей изменяется атрибут src. Src каждый раз разный. Это на саму капчу никакого влияния не оказывает (если мы этого не захотим, разумеется), но, для браузера это новое изображение, поэтому он его подгружает заново. В captcha.php создается абсолютно новый код, он записывается в сессию заново, заново рисуется картинка и возвращается после в тег img.

Вот так и делается полноценная капча с обновлением. Надеемся, что эта статья вам обязательно поможет.

PHP + Captcha — автоматизируем защиту форм

Одна из нетривиальных задач в реализации надежного и комфортного в поддержке веб-проекта – защита и ограничние принимаемых от пользователей данных.

Часто для этого применяется механизм защиты с помошью captcha (каптчи) [Completely Automated Public Turing test to tell Computers and Humans Apart]. Изначально задача каптчи – это защита от ввода данных с помощью компьюетра с использование специально обученного скрипта. И в большинстве случаев – это достаточно надежный механизм. Механизму сто лет в обед, поэтому статья, конечно посвящена не написанию очередног генератора каптч.

Здесь я попробую решить попутную, достаточно занудную задачу – как определить, что к нам начал «стучаться» робот, а не обычный человек. Ведь мы не хотим лишний раз создавать неудобство своим пользователям и заставлять разгадывать каптчи. Итак, попытка создать универсальный простой механизм для защиты определенных мест в своем PHP-проекте, будь то форма аутентификации или форма обратной связи.

Подготовка

1. Для начала, берем удобный генератор каптч, для этого я просто иду на Packagist.org, и ввожу в поиск «Captcha». Беру самый популярный пакет, читаю документацию – все ОК, беру.

2. Ставим composer, если еще нет. Идем в консоль, создаем директорию проекта и пишем в ней:
curl -sS https://getcomposer.org/installer | php
./composer.phar require gregwar/captcha:1.1

3. Далее создаем описание нашего проекта в появившемся файле composer.json:

4. Теперь создаем директорию для исходного кода библиотеки: src/CaptchaProtector. В ней заводим класс Protector в файле Protector.php.

Реализация логики защиты

5. Пока наш класс «защитник» ничего не делает, это просто каркас. Теперь добавим метод, который мы будем вызывать, когда хотим защитить тот или иной запрос с помощью каптчи. ВАЖНО – остальные функции протектора не будут работать до вызова метода protect

6. Реализуем функции получения IP клиента и сбора информации о запросах клиента.

7. По сути, основная логика защиты уже реализована — осталось добавить несколько вспомогательных методов

Применяем на практике

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

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL