Поиск по сайту Подписаться Реклама
Яндекс.Метрика
Яндекс цитирования
Информационный сайт по аудио и видео
blog o_0 ИгрыIce Hockey 2004ДецлF-15 Strike Eagle IiВ пухуАлёша ПоповичBlade TrinityСофтDeliPlayer 2.01Sex-BOX: смс приколы ниже поясаGens32 Surreal 1.76 РусификаторVirtualDub 1.6.17Miranda IM 0.7 Test Build 8LouderIt 2.0b1СтатьиПочувствуй себя самураем, играя в новый интернет игровой автомат Громовой КулакМир азарта и развлечений, сегодня доступен каждому желающемуИгровые автоматы стремительно завоевывают звание самых популярных развлечений онлайн-пространстваКраткий анализ популярных программ для DVD Authoring (2004 г.)Обзор виджетов обратного звонкаMPEG2 - хранение и передача видео (2005 г.) Вкусное700! игр для сотовых телефонов700! игр для сотовых телефоновПакет из 700 игр для мобильников! Преимущественно адаптированных для Siemens, но многие идут и на телефонах других марок. 64 мегабайта отборного…Сборник лучших игр Денди (NES, Dendy)Сборник лучших игр Денди (NES, Dendy)По многочисленным просьбам пользователей моего сайта www.ddvhouse.ru была собрана коллекция лучших, по мнению игроков, игр Денди. Все игры…

Как бороться с magic_quotes_gpc

В настоящей статье пойдет речь об одном из конфигурационных параметров языка программирования PHP — magic_quotes_gpc. Этот параметр играет важную роль, касающуюся, прежде всего, безопасности функционирования любого веб-приложения, обрабатывающего данные, полученные от пользователя и использующего для их хранения базу данных MySQL.

Параметр magic_quotes_gpc влияет на то, как будут обрабатываться специальные символы, содержащиеся в данных, передаваемых пользователем (массивы $_GET, $_POST, $_COOKIE). При magic_quotes_gpc = 1 эти спецсимволы [одиночные (') и двойные кавычки ("), обратный слеш (\), байт NULL] автоматически экранируются интерпретатором PHP (перед каждым таким символом добавляется обратный слеш). При magic_quotes_gpc = 0 все данные передаются в таком виде, в каком их ввел пользователь. В последнем случае в целях безопасности требуется обрабатывать передаваемые данные (в противном случае возможна атака SQL-injection) непосредственно в коде приложения. Для этого в PHP существует функция addslashes (выдержка из документации):

$str = "Is your name O'reilly?";

# выводит: Is your name O\'reilly?
echo addslashes($str);

Все, вроде бы, просто. Использование в коде приложения функции addslashes в случае, если заведомо известно, что директива magic_quotes_gpc равна 0, вполне обосновано. Но что если администратор хостинга решит установить ее значение в единицу? Будет происходить двойное экранирование спецсимволов! Поэтому, функцию addslashes необходимо применять только в том случае, когда magic_quotes_gpc = 0. Получить текущее значение данного конфигурационного параметра можно при помощи стандартной функции get_magic_quotes_gpc. Таким образом, более универсальный код будет иметь следующий вид:

$str = "Is your name O'reilly?";
$str = (!get_magic_quotes_gpc()) ? addslashes($str) : $str;

# выводит при любых настройках PHP: Is your name O\'reilly?
echo $str;

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

function addslashes_for_array(&$arr)
{
   foreach($arr as $k=>$v)
   {
       if (is_array($v))
       {
           addslashes_for_array($v);
           $arr[$k] = $v;
       }
       else
       {
           $arr[$k] = addslashes($v);
       }
   }
}

function fix_magic_quotes_gpc()
{
   if (!get_magic_quotes_gpc())
   {
       addslashes_for_array($_POST);
       addslashes_for_array($_GET);
       addslashes_for_array($_COOKIE);
   }
}

# экранирует при необходииости строки в $_GET, $_POST, $_COOKIE
fix_magic_quotes_gpc();

Следует заметить, что описанный код учитывает также тот факт, что в переменных $_GET, $_POST, $_COOKIE могут передаваться не только строки, но и многомерные массивы строк.

P.S. В ходе проведенного недавно нашей компанией исследования некоторых веб-сайтов выяснилось, что многие достаточно известные веб-разработчики не учитывают параметр magic_quotes_gpc. А жаль...

Взято с http://www.controlstyle.ru/

Выложено: 01/10/07