Реклама


Онлайн редактор HTML/CSS/JS кода- ( КЛИК ). Подробно - (Тут) | Онлайн COLOR PICKER - ( КЛИК ).
Лента - ( КЛИК ). BB-коды - ( КЛИК ).
iCoder.Uz

Показано с 1 по 4 из 4

Тема: Капча


  1. ID сообщения 63 #1
    impuLse #IT вне форума

    Капча

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

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

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

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

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

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

    Далее создается скрипт captcha.php. В начале скрипта объявляются необходимые переменные:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Это символы, которые будут участвовать в формировании капчи.
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    В этой переменной задается длина капчи (6 символов).
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


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


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


    Размер шрифта.

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


    Создаем изображение с заданными размерами:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Выставляем флаг необходимости сохранения альфа-канала изображения:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Создаем цвет фона. Это будет полностью прозрачный цвет:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Заливаем этим цветом наше созданное изображение:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Инициализируем переменную, в которой будет содержаться текстовое значение капчи:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Далее организовывается цикл с количеством итераций равным длине капчи (caplen):
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


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


    Вычисляем положение сгенерированного символа на изображении по оси x:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Это положение зависит от ширины изображения, длины капчи и порядкового номера символа. Далее мы добавляем немного "случайности" в это положение:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Вычисляем положение сгенерированного символа на изображении по оси y:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


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

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


    Для текущего символа случайным образом генерируем его угол наклона в диапазоне -25..25 градусов, чтобы буквы на капче "плясали":
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    И, наконец, рисуем символ со всеми выше полученными характеристиками на изображении:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


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


    Наконец, выводим сформированное изображение captcha:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    И освобождаем память, выведенную под изображение:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Пример использования капчи:
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...


    Обработка формы
    Пожалуйста, войдите или пройдите Регистрацию чтобы увидеть содержимое "PHP" BBкода...

  2. ID сообщения 81 #2
    A-Slava537 вне форума

    норм. если не ошибаюсь из сессии можно вытащить её же, и ей же зафлудить.

  3. ID сообщения 398 #3
    iAxel вне форума

    Ага если сделать бота чтобы только капчу открывать...

  4. ID сообщения 7223 #4
    Barkhayot вне форума

    Re: Капча

    klass esli ne oshibyoshsya

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  

12+