С головой в PHP. Пособие для новичков 4 часть (оценка: 1)
4. Фильтровать переменные
Уязвимостям посвящают огромные статьи, но на самом деле 90% всего можно уложить в один абзац.
От пользователя часто приходит всякая ерунда, нам нужно разобраться что с этим делать.
a) Итак, мы ожидаем от пользователя число, обработать его нужно так:
b)Мы ожидаем строку, которую нужно вывести в браузер:
Опять же уязвимости нет. Обрабатывать нужно все что приходит от пользователя: элементы из $_GET и $_POST данных, а также другие глобальные массивы типа $_SERVER, если вы направляете их в вывод. Все что так или иначе приходит от пользователя и выводится в браузер - уже уязвимость, если вы не предприняли выше обозначенных мер.
с) Мы используем переменную в sql-запросе, к примеру так:
$text = $_GET['text'];
mysql_query('SELECT * FROM `users` WHERE `user` = "' . $text . '";');
И это огромная дыра в вашем скрипте, чтоб такого не было, и какой-нибудь вредитель не наделал беды, делаем так:
Все! Волшебная функция сделает все за нас. Но тут есть два момента. Первый: использовать mysql_real_escape_string() лучше в самом запросе, как в примере. Если отдельно перезаписать переменную:
при выводе в браузер в самой переменной перед спецсимволами появятся слэши. В итоге полученные данные не будут соответствовать первоначальным. Второе: если вы выводите текст из базы в браузер, его все равно нужно фильтровать согласно пункту 4b. Как вариант, в базу можно добавить сразу обработанный сразу двумя функциями текст:
тогда при выводе из базы о фильтрации можно не беспокоиться.
d)
Register_globals всегда должен быть отключен!!
Хоть эта опция на большинстве хостингов и так отключена, лишний раз проверить не помешает.
Если все же нарвались на плохой хостинг, отключить можно в корневом в .htaccess дописав строчку "php_flag register_globals off" (без кавычек) или в php.ini, или в настройках панели управления.
Дело в том, что, если вы явно не инициализируете переменную (как это нужно делать в любой другом языке) с включенным register_globals, можно получить уязвимость откуда не ждали.
e)
Инициализация переменных - штука не обязательная, но желательная. Разные версии php, в зависимости от настроек, могут выдавать или не выдавать warning'и, если вы отправите переменную прямо в бой, поэтому лучше делать так:
$text = ''; //$text = 'Какой-то текст'; - тоже считается
$intvar = 0;
Проверять вероятно не существующие переменные нужно так:
а не так:
поскольку если переменной не существовало, будет сгенерировано предупреждение, которое выскакивает в зависимости он настроек PHP, что нам совершенно не нужно.