Фильтруй базар
Логика чистки информации на PHP
Полоса новостей с использованием js и слоев
Создание системы учета посещений |
Логика
чистки информации на PHP
Автор: Алекс aka TrigGer
Источник: Коврик
TrigGer'a
Рано или поздно перед начинающим программистом встает вопрос о том, как
же все-таки произвести чистку ненужных элементов, которые иногда появляются
в тексте, передаваемом пользователем через 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 :)
|