Не так давно я писал о создании простой формы обратной связи, которую можно написать собственноручно «на коленке» за 5 минут. Целью поста было — ознакомить с тем, как данные через форму отправляются, получаются и применяются по назначению. Тогда я не учёл, что многие не искушённые в программировании люди просто скопируют этот действительно простой код и воткнут себе на сайт. Что ж, раз так, будем делать из учебного примера простой формы связи рабочий инструмент.

Первое, о чём следует позаботиться при работе с реальным пользовательским вводом, — это безопасность. Никогда не догадаешься, что введёт пользователь в форму на сайте, но, на всякий случай, надо пресечь всякие возможности похулиганить. Например, мы записываем принятые данные в базу MySQL, чтобы потом в админке почитать их за рюмочкой кофе. Без проверки вводимых данных злоумышленник может при помощи SQL-инъекции получить доступ к базе данных. Даже если мы просто отправляем данные себе на e-mail или сохраняем в файл, есть риск получить вместе с отзывом вредоносный код, последствия работы которого могут быть разными.

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

Вероятность такого печального течения событий очень мала. Но давайте верить Чехову: «если в первом акте на стене висит ружье, то в последнем оно обязательно выстрелит» — и не вешать ружьё заниматься профилактикой, пока последствия не заявили о себе.

Проверка введённых в форму данных средствами PHP

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

Удаляем из принятых данных HTML и PHP код. Код опасным бывает редко, и не всякий код опасен. Но, если я жду от человека отзыв, меня интересует только текст. Удаляет код PHP-функция:

$s = @ strip_tags ($s);

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

Ограничиваем длину строки. Может это и не так важно, но я предпочитаю задумываться, какой длины будут пользовательские данные. Например, e-mail вряд ли будет больше 50 символов, а размер отзыва вряд ли превысит 5000 символов. Усекаем длину:

$s = substr (s, 0, 50);

Где 50 — это максимальная длина, которую будет иметь стока на выходе (если строка была меньше, изменений не произойдёт).

Теперь немного о том, как избежать SQL-инъекций (вредоносных вставок в SQL-запрос, позволяющих злоумышленнику выполнять свои запросы к базе данных). Все текстовые данные нужно отправлять в одинарных кавычках. Пример запроса, вставляющего строку $s в таблицу table:

$query = "INSERT INTO `table` VALUES ('$s')";

Предварительно надо заменить в строке $s все одинарные кавычки на двойные, либо экранировать одинарные кавычки (подставить перед ними символ «\»). Первая строка кода заменяет кавычки, вторая — экранирует все спецсимволы, выберите себе один из вариантов:

$s = str_replace ("'", '"', $s);
$s = addslashes ($s);

Если планируется отправить в базу числовое значение, переменную можно отправлять без кавычек, но предварительно надо убедиться в том, что мы отправляем число. Эта операция преобразует $s в число, даже если была передана строковая величина (например, «10 мужиков» преобразуется в «10»):

$s = (int) $s;

Такими нехитрыми действиями можно отбить у хулиганов всякое желание посещать ваш сайт.

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

Может я что-то забыл? Вы знаете другие средства защиты? Пишите в комментариях.

Запись опубликована 17 февраля 2010 года. Не так давно в рубрике «Web-кодинг» были опубликованы следующие посты:

Подписка на RSS канал блога RSS подписка (как это?) поможет вам не пропустить ничего интересного на этом блоге.