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