Логика чистки информации на PHP. Обезвреживание данных в формах.
Автор: неизвестен
Редактор: Кирилл Шагин

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


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

Сначала нужно сформулировать задачу, к которой мы будем применять данный алгоритм. Для примера возьмем небольшую форму, состоящую из двух полей - это поле для ввода имени (назовем его name) и поле для ввода
комментариев, например, для какой-нибудь статьи (назовем его comment). С задачей определились, теперь осталось
обозначить символы, которые потенциально опасны для нашей web-странички. Если мы будем записывать всю полученную информацию от пользователя в отдельный файл, а потом этот файл вставлять в одну из наших страниц, предварительно не почистив эту информации, то может произойти не обратимое, а так как нам лень лишний раз
лезть в этот файл и чистить там своими руками, то предоставим это дело скрипту.

Сначала я приведу саму логику, а потом подробно раскомментирую каждую строку.

Приступим.

   $name=substr($name,0,22);
   $name=str_replace(" ","",$name);
   $name=htmlspecialchars($name);
   $name=str_replace("<","",$name);
   $name=str_replace(">","",$name);
   $name=str_replace("<","",$name);
   $name=str_replace(">","",$name);
   $name=str_replace("\r","",$name);
   $name=str_replace("\n"."",$name); 
$comment=substr($comment,0,500);
   $comment=htmlspecialchars($comment);
   $comment=str_replace("<","",$comment);
   $comment=str_replace(">","",$comment);
   $comment=str_replace("<","",$comment);
   $comment=str_replace(">","",$comment);
   $comment=str_replace("\r","",$comment);
   $comment=str_replace("\n","",$comment);

Вышеприведенный код чистит поступившую информацию от пользователя, а потом, когда зачистка произведена, записывает ее в файл и таким образом нам нечего опасаться. А теперь разберем каждую строчку в отдельности.

$name=substr($name,0,22); - данная строка предназначена для того, чтобы обрезать слишком длинное имя. То есть функция substr возвращает 22 символа из введенной строки в поле имя. Такой длинны пользователю должно хватить,
чтобы написать свое имя, но можно и увеличить количество символов. Состав функции - $name - нам говорит из какой переменной надо возвращать 22 символа. 0 - это начало отсчета. 22 - конец, то есть до куда должна быть возвращена строка. Таким образом, данная функции, в просторечье, обрезает длину любой информации, сохраненной в той или иной переменной (в данном случае в переменной name).

$name=str_replace(" ","",$name);
Что можно сказать о данной строке? Увидев такую строку, программист сразу понимает, что данная функция обрезает все пробелы из строки, переданной в переменной. " " - означает в строке пробел, а "" - это у нас чем этот пробел заменяется, то есть пробел заменяется ничем. Рассмотрим пример: пользователь ввел свое имя, допустим, Саша Петров, после обработки этой строки она будет выглядеть вот так "СашаПетров". Как видите это не очень удобно, так что применяйте эту строку с умом.

$name=htmlspecialchars($name);
Что это такое? Функция htmlspecialchars обезвреживает html-тэги, которые пользователь ввел, но не убирает их совсем, а
заменяет: преобразует в в самом тексте будет выглядеть, как , а внутри документа - "" преобразует в " < преобразует в <
> преобразует в >. Таким образом, мы обезвредим потенциально опасные html-тэги, которые могут повредить нашему
документу. Если мы это не сделаем, то пользователь не пойдет нам на встречу и не будет благоразумным и может вставить, в самом лучшем случае - картинку, в самом худшем - звук, который или испортит внешний вид нашей
странички или сделает так, что она будет долго грузиться, а это нам надо?

После выше сказанного вы сами должны разобраться. Хочу только добавить, что я всегда обрезаю знаки: < > Это делается затем, чтобы, если пользователь все-таки решил побаловаться и написал <b>Миша</b>, то данный
алгоритм выведет у нас bМиша/b - это нам сразу дает понять, что кто-то все-таки решил побаловаться. Конечно, мы не
можем фильтровать каждую букву, что может привести к плачевным результатам, так что лучше с этим не экспериментируйте.

Хочу еще добавить, что знаки: \r и \n лучше всегда обрезать, если вы используете файлы, куда записываете информацию, так \r - это возврат каретки на предыдущую строку, то есть, если вы, например, написали в алгоритме записи в файл так .\n, то у вас курсор встанет на следующую строку и таким образом вам будет легче заносить этот файл в массив, но если пользователь поставит все-таки знак \r, то это вернет курсор на строку вверх и после этого, если
туда добавить еще какую-нибудь запись, то это приведет к плачевным результатам и файл в массив считать уже будет
проблематично. Как вы уже поняли знак \n означает перевод каретки (курсора) на следующую строку, что часть практикуется. Все эти знаки лучше обрезать - поверьте так лучше.

И напоследок - удачи вам в изучении PHP :)

Hosted by uCoz