Создание гостевой книги на PHP. Версия 0.02

Thursday, 11 February 2010 | Автор: programmer

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

 

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

 

    function captcha($code) {
        $im = imagecreate (strlen($code)*20, 20) or die ("Cannot initialize new GD image stream!");
        $bg = imagecolorallocate ($im, 232, 238, 247);

        //создаём шум на фоне
        for ($i=0; $i<=128; $i++) {
            $color = imagecolorallocate ($im, rand(0,255), rand(0,255), rand(0,255)); //задаём цвет
            imagesetpixel($im, rand(2,strlen($code)*20), rand(2,20), $color); //рисуем пиксель
        }

        //выводим символы кода
        for ($i = 0; $i < strlen($code); $i++) {
            $color = imagecolorallocate ($im, rand(0,255), rand(0,128), rand(0,255)); //задаём цвет
            $x = 5 + $i * 20;
            $y = rand(1, 6);
            imagechar ($im, 5, $x, $y, $code[$i], $color);
        }


        //антикеширование
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");

        //создание рисунка в зависимости от доступного формата
        header("Content-type: image/png");
        imagepng($im);
        imagedestroy ($im);
    }

 

Сам процесс создания капчи соостоит из следующих частей:

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

Ничего сложного. Теперь создадим файл captcha.php в том же каталоге, где лежит файл index.php. Этот файл будет отвечать за работу с классом Image и формированием капчи:

 

<?php
    include "class/images.php";

    function randCode($length) {
        $letters = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890";
        $result = "";
        for ($i=0; $i<$length; $i++)
            $result .= substr($letters, mt_rand(0, strlen($letters)-1), 1);
        return $result;
    }

    session_start();

    $captcha = new Image();
    $_SESSION['code'] = randCode(6);

    $captcha->captcha($_SESSION['code']);
?>

 

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

 

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

 

А в самой форме добавления сообщения добавляем вывод изображения капчи и поле ввода кода пользователем:

<img src="captcha.php" border="0" alt="Captcha">

 

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

                function verify() {
                    $err = array();
                    if (strlen(trim($_POST['name']))===0) $err[] = "Вы не ввели имя";
                    if (strlen(trim($_POST['text']))===0) $err[] = "Вы не ввели текст сообщения";
                    if ($_POST['captcha'] != $_SESSION['code']) $err[] = "Проверочный код введен не верно";
                    return implode("<BR/>n", $err);
                }

 

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

 

Вроде всё

 

Посмотреть саму работу скрипта можно тут: http://phpprogs.ru/test/guestbook2/

Обсудить работу гостевой книги можно на форуме: http://phpprogs.ru/forum/

Скачать проект: [attachment=3]



 
Tweet


Категория(и): Изучаем PHP, Скрипты, MySQL

Комментарии


Sunday, 20 June 2010 | 20:26:40 | Автор: medukha

r

Friday, 21 January 2011 | 17:04:39 | Автор: bridun

а как скачать [ attachment=3]

 

Friday, 21 January 2011 | 17:06:30 | Автор: programmer

http://phpprogs.ru/uploads/guestbook0.03.zip

Отвечу на вопросы по PHP

Добавить комментарий
Чтобы оставить комментарий, Вам необходимо зарегистрироваться или авторизироваться