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

Итак, ранее я представил скрипт, который позволяет добавлять комментария на сайт. По нему уже было написано несколько постов. Но вот я опустил один момент, который я хотел реализовать сразу. Это защита комментариев от спама. Это даже и к лучшему, так как я сейчас смогу вам рассказать про данную возможность.
Предыдущие статьи по скрипту
- Система комментариев сайта - описание, особенности и установка скрипта.
- Интеграция комментариев в блог - вставка скрипта в сайт с PHP+MySQL на примере.
История развития
В далёком, далёком прошлом понятие "спам" и вовсе не существовало. Все жили дружно. Это сейчас спам массово используется для продвижение своих товаров и услуг в сети. Но со временем, когда он начинал потихоньку зарождаться, веб-мастерам приходилось искать возможные средства защиты.
Первоначально в качестве защиты использовались цифры, которые выводились в форме и которые посетитель должен ввести в отдельное текстовое поле. Отдако, спамеры не стояли на одном месте и придумали бота, который просматривает исходный код формы и, если там найдёт какие-то подозрительные символы, то парсит их в поле. Результат - получаем спамерский комментарий на своём сайте.
Тогда разработчики поняли, что нужно сделать так, чтобы роботы не смогли прочесть эти символы. Решение было найдено - изобразить цифры на изображении, ведь роботы не умеют читать содержимое картинки. По такому принципу я предлагаю реализовать защиту и в нашем скрипте.
Принцип реализации защиты
Алгоритм очень простой: мы создаём в табличке новой поле, в котором будет храниться результат. В форме выводим изображение, содержащее арифметический пример, и рядом с изображением добавим новое поле, в которое стоит ввести результат, полученный при решении. Когда пользователь ввёл все данные, содержимое летит в обработчик. Если пользователь правильно решил пример, то есть результат совпадает со значение поля, то комментарий успешно добавляется, нет - не добавляется.
Процесс создания
Скачиваем скрипт и этой статьи и сейчас будем вносить в него изменения.
1. Создание защитного изображения.
Я уже набросал следующее изображение в Фотошопе размером 90х45:

Можете использовать моё, а можете и своё создать.
2. Вносим изменения в код формы.
Сейчас код нашей формы (index.php) выглядит следующим образом:
<form name="comment_f" class="comment-form" method="post" action="submit.php">
<p>Имя:<br/><input name="name" type="text"/></p>
<p>Email:<br/><input name="email" type="text"/></p>
<p>Текст:<br/><textarea name="text" rows="5" cols="30"></textarea></p>
<p><input class="button" name="button" type="submit" value="Добавить"/></p>
</form>
Создадим новое скрытое текстовое поле, вставим изображение, и код формы преобретёт следующий вид:
<form name="comment_f" class="comment-form" method="post" action="submit.php">
<p>Имя:<br/><input name="name" type="text"/></p>
<p>Email:<br/><input name="email" type="text"/></p>
<p>Текст:<br/><textarea name="text" rows="5" cols="30"></textarea></p>
<p>Решите пример:<br/><img class="spam-img" align="middle" src="images/spam.jpg" alt="Включите изображение"/>
<input type="text" size="3" name="spam"/></p>
<p><input class="button" name="button" type="submit" value="Добавить"/></p>
3. Стилизация изображения.
Замечаем, что изображению (во 2 пункте) мы дали класс spam-img, теперь нужно рассписать данный класс в нашей таблице стилей style.css. Добавляем следующие строки:
.spam-img {
border: 1px solid #999; /*Рамка*/
margin-top:6px; /*Отступ сверху*/
}
4. Создадим новое поле в БД для результата.
Новое поле будем создавать в таблице advanced. Поле будет называть spam. Вставляем SQL-запрос:
ALTER TABLE `advanced` ADD `spam` INT( 5 ) NOT NULL;
UPDATE `advanced` SET `spam` = '24' WHERE `id` =1 LIMIT 1
24 - это результат, полученный при решении примера. Если у вас пример свой, то замените на другое значение.
5. Редактируем файл-обработчик.
Открываем submit.php. Для начала нам нужно результат, находящийся в БД, вывести, то есть сделать доступным для работы, чтобы с ним можно было работаться. Для этого прописываем:
$res=mysql_query("SELECT spam FROM ".$tbl2."",$db);
$row=mysql_fetch_array($res);
Для того чтобы защитить поле от постороннего ввода прописываем:
$spam = trim ($_POST["spam"]);
$spam = htmlspecialchars ($spam);
Теперь нужно защититься, когда пользователь оставит поля пустыми:
if (!isset($spam) or empty ($spam)) {echo "<meta http-equiv='refresh' content='3;URL=$_SERVER[HTTP_REFERER]'>";exit ("<div align='center'><div class='alert'>Вы не решили пример!</div></div>");}
Осталось проверить, правильно ли решил пример юзер:
if ($row["spam"] !== $spam) {echo "<meta http-equiv='refresh' content='3;URL=$_SERVER[HTTP_REFERER]'>";exit ("<div align='center'><div class='alert'>Вы неправильно решили пример!</div></div>");}
- $row["spam"] - правильный результат, который находится в БД.
- $spam - то, что ввёл пользователь.
- !== - значёк, говорящий, что один элемент не равен другому.
- if(условие) {что делать} - функция для проверки условия (на русском языке - "если").
- empty - функция проверки элемента на пустоту, то есть когда переменная равна 0.
- !isset - функция проверки элементы на несуществование (обратное - isset).
На русском языке данную строке можно воспроизвести следующим образом:
Если правильный результат (24) не соответствует значение, введённому пользователем, то выводить сообщение "Вы неправильно решили пример!".
На стрине я отметил новые строки. Также в файле, который прикладываю в архиве, я прокомментирировал каждую новую строку.

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

Рубрика:
Просмотров: 3547
Дата: 13.11.09


2.03.10
3.02.10
12.01.10
28.11.09
22.11.09
22.10.09
27.09.09
18.09.09
18.08.09
6.08.09