Вход Регистрация
С головой в PHP. Пособие для новичков 4 часть (оценка: 1)
4. Фильтровать переменные
Уязвимостям посвящают огромные статьи, но на самом деле 90% всего можно уложить в один абзац.
От пользователя часто приходит всякая ерунда, нам нужно разобраться что с этим делать.

a) Итак, мы ожидаем от пользователя число, обработать его нужно так:

  1. $id = abs(intval($_GET['id']));


b)Мы ожидаем строку, которую нужно вывести в браузер:

  1. $text = htmlentities($_GET['text'], ENT_QUOTES, 'UTF-8');
  2. echo $text;


Опять же уязвимости нет. Обрабатывать нужно все что приходит от пользователя: элементы из $_GET и $_POST данных, а также другие глобальные массивы типа $_SERVER, если вы направляете их в вывод. Все что так или иначе приходит от пользователя и выводится в браузер - уже уязвимость, если вы не предприняли выше обозначенных мер.

с) Мы используем переменную в sql-запросе, к примеру так:

  1. $text = $_GET['text'];
  2. mysql_query('SELECT * FROM `users` WHERE `user` = "' . $text . '";');


И это огромная дыра в вашем скрипте, чтоб такого не было, и какой-нибудь вредитель не наделал беды, делаем так:

  1. $text = $_GET['text'];
  2. mysql_query('SELECT * FROM `users` WHERE `user` = "'.mysql_real_escape_string($text).'";');


Все! Волшебная функция сделает все за нас. Но тут есть два момента. Первый: использовать mysql_real_escape_string() лучше в самом запросе, как в примере. Если отдельно перезаписать переменную:

  1. $text = mysql_real_escape_string($text);


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

  1. $text = $_GET['text'];
  2. $text = htmlentities($text, ENT_QUOTES, 'UTF-8');
  3. mysql_query('INSERT INTO `users` SET `user` = "' . mysql_real_escape_string($text) . '";');


тогда при выводе из базы о фильтрации можно не беспокоиться.


d)
Register_globals всегда должен быть отключен!!
Хоть эта опция на большинстве хостингов и так отключена, лишний раз проверить не помешает.
Если все же нарвались на плохой хостинг, отключить можно в корневом в .htaccess дописав строчку "php_flag register_globals off" (без кавычек) или в php.ini, или в настройках панели управления.
Дело в том, что, если вы явно не инициализируете переменную (как это нужно делать в любой другом языке) с включенным register_globals, можно получить уязвимость откуда не ждали.

e)
Инициализация переменных - штука не обязательная, но желательная. Разные версии php, в зависимости от настроек, могут выдавать или не выдавать warning'и, если вы отправите переменную прямо в бой, поэтому лучше делать так:

  1. $text = ''; //$text = 'Какой-то текст'; - тоже считается
  2. $array = array();
  3. $intvar = 0;


Проверять вероятно не существующие переменные нужно так:

  1. if(isset($text)) {}

а не так:

  1. if($text) {}


поскольку если переменной не существовало, будет сгенерировано предупреждение, которое выскакивает в зависимости он настроек PHP, что нам совершенно не нужно.
Автор: * Taltos * / 12.03.2015 в 12:12
Просмотров: 686
ТОП блогов | поиск | все блоги
Онлайн: 1
Реклама