<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
<stylesheet type="text/css">
.body{font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
}
.p{margin:0.5em 0 0 0.3em; padding:0.2em; text-align:justify;
}
</stylesheet>
<description>
<title-info>
<genre>sf_history</genre>
<author>
<first-name>Имя автора</first-name>
<last-name>Фамилия автора</last-name>
</author>
<book-title>Название книги</book-title>
<annotation></annotation>
<date>Дата</date>
<lang>ru</lang>
</title-info>
<document-info>
<author><nickname></nickname>
</author>
<program-used>Lib converter jcms</program-used>
<date value=""></date>
<src-url>http://johncms.com</src-url>
<id></id>
<version>1.0</version>
<history><p>book</p></history>
</document-info>
</description>
<body>
<title><p>Фильтрация данных в PHP</p>
</title>
<section><p>Каждый web-мастер должен уметь не только писать скрипты, но и грамотно организовывать защиту своих творений. Одним из важнейших навыков является умение правильно фильтровать всю информацию, поступающую от пользователя. Об этом и пойдет речь в моей статье. </p>
<p></p>
<p>Прежде всего, следует фильтровать данные, которые передает пользователь осознанно - в основном, это данные различных форм. Это может быть пара логин-пароль для входа, пункт голосования и т.п. Например, такая форма </p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p> </p>
<p></p>
<p>После нажатия кнопки "OK" передаст скрипту index.php два значения - $login и $pass. Как их можно отфильтровать? Пример для переменной $login: </p>
<p></p>
<p>if($login)</p>
<p>{</p>
<p>$login = htmlspecialchars((stripslashes($login)), ENT_QUOTES);</p>
<p>$login = str_replace("/","",$login);</p>
<p>$login = str_replace(".","",$login);</p>
<p>$login = str_replace("`","",$login);</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>echo "Логин не введен!";</p>
<p>}</p>
<p></p>
<p>В первой строке мы проверяем существование переменной $login, если она существует - идем дальше, если нет - выводим сообщение об ошибке. Затем с помощью функции htmlspecialchars заменяем в этой переменной спецсимволы на их HTML мнемоники. То есть знак `<` меняется на `<`, `&` меняется на `&` и т.д. Функция stripslashes вырезает знак обратного слеша ``. Далее с помощью str_replace вырезаем знак прямого слеша, точку (иногда бывает полезно) и обратную кавычку. </p>
<p></p>
<p>Если вы знакомы с регулярными выражениями, то предыдущий пример можно записать гораздо короче: </p>
<p></p>
<p>if($login)</p>
<p>{</p>
<p>if (preg_match("/[0-9a-z_]/i", $login))</p>
<p>{</p>
<p>// … действия над логином …</p>
<p>} </p>
<p>else</p>
<p>{</p>
<p>echo "Логин введен неверно!";</p>
<p>}</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>echo "Логин не введен!";</p>
<p>} </p>
<p></p>
<p>Этот фрагмент кода будет проверять введенный логин на соответствие регулярному выражению `/[0-9a-z_]/i`, которое означает: все цифры + все латинские буквы в любом регистре + знак подчеркивания. Если логин содержит другие символы, то будет показано сообщение об ошибке. </p>
<p></p>
<p>Аналогично фильтруются переменные, получаемые скриптом через URL. В движках сайтов можно встретить что-то вроде таких ссылок: </p>
<p></p>
<p>http://www.site.com/index.php?module=news </p>
<p></p>
<p>Если не фильтровать переменную $module (или $_GET[`module`], если register_globals отключен), то над сайтом могут вытворяться не очень хорошие вещи, вроде XSS. Нужно применять первый приведенный мной скрипт-чистильщик, разумеется, убрав сообщения об ошибках. </p>
<p></p>
<p>Следующее, на чем бы я хотел остановиться - это фильтрация кукисов. Думаю, что даже если вы начинающий программист, то с "плюшками" вы сталкивались, а насчет их проверки даже не задумывались. Зря! Если вы используете SQL-базы данных, то отсутствие проверки кукисов может привести к использованию хакерами SQL-injection. Так как в кукисах, в основном, мы используем определенный тип данных, например, только числа, то проверку данных можно проводить с помощью все тех же регулярных выражений. Допустим, у нас есть кукис "id", в котором хранятся числовые данные. Его проверка: </p>
<p></p>
<p>if($_COOKIE[`id`])</p>
<p>{</p>
<p>if (preg_match("/[0-9]/", $_COOKIE[`id`])</p>
<p>{</p>
<p>// … действия над кукисом …</p>
<p>} </p>
<p>else</p>
<p>{</p>
<p>echo "Хм, странный кукис. Не пойдет!";</p>
<p>}</p>
<p>}</p>
<p></p>
<p>В сети есть огромное количество документации посвященной взлому сайтов, в частности, там показаны различные случаи использования XSS и приемы обхода фильтрации. Но мы то с вами уже умеем защищаться от непрошенных гостей</p>
</section>
</body>
</FictionBook>