Блог о SEO оптимизация и поисковое продвижение
17 Фев
Не так давно я писал о создании простой формы обратной связи, которую можно написать собственноручно «на коленке» за 5 минут. Целью поста было — ознакомить с тем, как данные через форму отправляются, получаются и применяются по назначению. Тогда я не учёл, что многие не искушённые в программировании люди просто скопируют этот действительно простой код и воткнут себе на сайт. Что ж, раз так, будем делать из учебного примера простой формы связи рабочий инструмент.
Первое, о чём следует позаботиться при работе с реальным пользовательским вводом, — это безопасность. Никогда не догадаешься, что введёт пользователь в форму на сайте, но, на всякий случай, надо пресечь всякие возможности похулиганить. Например, мы записываем принятые данные в базу MySQL, чтобы потом в админке почитать их за рюмочкой кофе. Без проверки вводимых данных злоумышленник может при помощи SQL-инъекции получить доступ к базе данных. Даже если мы просто отправляем данные себе на e-mail или сохраняем в файл, есть риск получить вместе с отзывом вредоносный код, последствия работы которого могут быть разными.
Кстати, недавно осознал, что контекстная реклама — это двигатель прогресса. Только с помощью неё можно гарантированно в короткие сроки получить целевого посетителя. Если вы пришли сюда по контекстной рекламе, прошу отписаться в комментариях — оцениваю эффективность рекламной кампании.
Вероятность такого печального течения событий очень мала. Но давайте верить Чехову: «если в первом акте на стене висит ружье, то в последнем оно обязательно выстрелит» — и не вешать ружьё заниматься профилактикой, пока последствия не заявили о себе.
Я не доверяю пользовательскому вводу и при проверке данных, введённых в форму, удаляю всё, что мне не нужно. Вы можете выбрать только те проверки, которые сочтёте необходимыми.
Удаляем из принятых данных 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 подписка (как это?) поможет вам не пропустить ничего интересного на этом блоге.
На «Безопасность своих скриптов — проверка пользовательского ввода» получено 7 отзывов
Спасибо. Кусок про инъекции был полезен для повторения, а вот за int благодарен. Это для меня было новым приемом.
Всегда пожалуйста, приходите ещё
Ну не знаю, разве этого кода хватет для защиты сайта? Не думаю, но конечно спасибо за начальную стадию защиты.
Этот код, разумеется, не защитит от хакерской атаки на сервер. Но он предназначен исключительно для очистки пользовательского ввода от злонамеренного кода, который может нарушить работу сайта. Согласен с вашим отношением, Ольга: в работе с пользовательским вводом паранойя приветствуется
Покажите пожалуйста как правильно применить $s = @ strip_tags ($s);
Например, у меня через форму загружается удаленный xml. Как можно эту форму обезопасить?
Спасибо, всегда старался избегать эту тему, так как наслышан об этом, а на пхп программирую средненько. Надеюсь, этого и вправду будет достаточно для защиты от злых намерений
очень хорошая статья о защите, но и о самой простой форме так же...буду пользоваться нею обязательно.
Я вам очень благодарен — помогли , ато времени учить азы пхп не было...
для достоверности как работают скрипты — можете посмотреть на моем сайте в разделе обратная связь...
еще раз спасибо!!!
Ваше SEO-мнение
Я прошу высказать своё мнение, а не оставить ссылку на раскручиваемый сайт. В любом случае, ссылки в комментариях у меня закрыты от индексации, если интересует качественный обмен ссылками -обращайтесь