Простая защита от MySQL injection

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

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

Напомню, что такое mySQL инъекции. Предположим у нас есть страница: , которая обращается к базе данных примерно таким образом: SELECT * FROM `pages` WHERE `id`='$page' вродебы все в порядке, но если мы зайдем на http://example.com/index.php?page=1' , то увидим ошибку. Она возникакет из-за недостаточной фильтрации переменных, в результате которых запрос становится таким: SELECT * FROM `pages` WHERE `id`='1''. Он возвратит ошибку. Злоумышленик может использовать возможность подстановки одинарной кавычки - '.

Как защититься от инъекции? Многие с пеной у рта доказывают, что нужно включать magic_quotes и фильтровать переменные регулярными выражениями.

Это заблуждение, чтобы обезопасить скрипт от mysql injection достаточно проверять тип переменных и экранировать одинарные кавычки. Так например в моем примере достаточно одной строчки:

 

<?

if(!is_numeric($_GET['page'])$_GET['page']=0;

?>

 

 

Если же вам нужно передавать в базу текст, то с помощью функции mysql_real_escape_string вы обезопасите свой скрипт. Единственное НО, у вас должны быть отключены magic_quotes.

 

$text=mysql_real_escape_string($_GET['text']);

 

 

Возможно мое решение покажется вам слишком простым, но зайдите на оффициальный сайт php и почитайте о функцииmysql_real_escape_string вот здесь http://ru.php.net/manual/en/function.mysql-real-escape-string.php вы увидите такую строчку:

Note: If this function is not used to escape data, the query is vulnerable to SQL Injection Attacks.

Прим: Если эта функция не используется для обработки данных, запрос подвержен SQL Injection.

 

P.S. Кроме привычных GET и POST не забывайте фильтровать данные из массивов SESSION и COOKIE


© Alexander Semion