Защита комментариев от спама

Добрый вечер, друзья! Хотя какой он добрый. Мало того что материал, который я должен добавить в среду, публикую сейчас (проблемы с Интернетом), так ещё удалил файл, в котором хранил эту статью (она была написана заранее, и на её написание было потрачено полдня). Ну что же, не без греха. Давайте лучше переходить к хорошему. Хоть дословно я не смог восстановить то, что было написано мною ранее, но во всяком случае попытался.

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

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

Первоначально в качестве защиты использовались цифры, которые выводились в форме и которые посетитель должен ввести в отдельное текстовое поле. Отдако, спамеры не стояли на одном месте и придумали бота, который просматривает исходный код формы и, если там найдёт какие-то подозрительные символы, то парсит их в поле. Результат - получаем спамерский комментарий на своём сайте.

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

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

Скачиваем скрипт и этой статьи и сейчас будем вносить в него изменения.

1. Создание защитного изображения.

Я уже набросал следующее изображение в Фотошопе размером 90х45:

Можете использовать моё, а можете и своё создать.

2. Вносим изменения в код формы.

Сейчас код нашей формы (index.php) выглядит следующим образом:

Имя:

Email:

Текст:

Синтаксис: html

Синтаксис: html

Создадим новое скрытое текстовое поле, вставим изображение, и код формы преобретёт следующий вид:

Имя:

Email:

Текст:

Решите пример:
Включите изображение

Синтаксис: html

Синтаксис: html

3. Стилизация изображения.

Замечаем, что изображению (во 2 пункте) мы дали класс spam-img, теперь нужно рассписать данный класс в нашей таблице стилей style.css. Добавляем следующие строки:
.spam-img {
border: 1px solid #999; /*Рамка*/
margin-top:6px; /*Отступ сверху*/
Синтаксис: css
}Синтаксис: css

4. Создадим новое поле в БД для результата.

Новое поле будем создавать в таблице advanced. Поле будет называть spam. Вставляем SQL-запрос:
ALTER TABLE `advanced` ADD `spam` INT( 5 ) NOT NULL;
Синтаксис: sql
UPDATE `advanced` SET `spam` = '24' WHERE `id` =1 LIMIT 1Синтаксис: sql

24 - это результат, полученный при решении примера. Если у вас пример свой, то замените на другое значение.

5. Редактируем файл-обработчик.

Открываем submit.php. Для начала нам нужно результат, находящийся в БД, вывести, то есть сделать доступным для работы, чтобы с ним можно было работаться. Для этого прописываем:
$res=mysql_query("SELECT spam FROM ".$tbl2."",$db);
Синтаксис: php
$row=mysql_fetch_array($res);Синтаксис: php

Для того чтобы защитить поле от постороннего ввода прописываем:
$spam = trim ($_POST["spam"]);
Синтаксис: php
$spam = htmlspecialchars ($spam);Синтаксис: php

Теперь нужно защититься, когда пользователь оставит поля пустыми:
Синтаксис: php
if (!isset($spam) or empty ($spam)) {echo "";exit ("

Вы не решили пример!

");}Синтаксис: php

Осталось проверить, правильно ли решил пример юзер:
Синтаксис: php
if ($row["spam"] !== $spam) {echo "";exit ("

Вы неправильно решили пример!

");}Синтаксис: php
$row["spam"] - правильный результат, который находится в БД.
$spam - то, что ввёл пользователь.
!== - значёк, говорящий, что один элемент не равен другому.
if(условие) {что делать} - функция для проверки условия (на русском языке - "если").
empty - функция проверки элемента на пустоту, то есть когда переменная равна 0.
!isset - функция проверки элементы на несуществование (обратное - isset).

На русском языке данную строке можно воспроизвести следующим образом:

Если правильный результат (24) не соответствует значение, введённому пользователем, то выводить сообщение "Вы неправильно решили пример!".

На стрине я отметил новые строки. Также в файле, который прикладываю в архиве, я прокомментирировал каждую новую строку.

Файлы, которые подверглись изменению
index.php - главный файл, в котором выводятся комментария, и отображается форма.
submit.php - файл, отвечающий за обработку нового комментария.
style.css - таблица стилей.
images/ - добавилось новое изображение в папке.

На этом у меня всё. До новых встреч!