Лучший способ отключить магические кавычки php без php.ini или .htaccess - PullRequest
1 голос
/ 12 июля 2011

Мне нужно написать переносимый код, который будет работать на общем сервере с включенным magic_qoutes_gpc, и я не могу изменить это в php.ini или .htaccess. (на сервере работает php 5.2)

Кажется, существует множество функций для стрип-слэшей со всех суперглобальных $_GET, $_POST и т. Д., Но я не уверен, что это лучший вариант. Также некоторые комментарии здесь , кажется, говорят, что к клавишам также добавлены косые черты, которые также должны быть удалены. Так что я должен использовать один на сайте PHP:

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
             unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

или как-то так: (из этого ответа: PHP - более короткое решение для магических кавычек )

function strip_slashes_recursive(&$value) {
    if (!is_array($value)) {
        $value = strip_slashes($value);
    } else {
        foreach (array_keys($value) as $key) {
            $arrayValue = strip_slashes_recursive($value[$key]);
            unset($value[$key]);
            $value[strip_slashes($key)] = $arrayValue;
        }
    }
}

foreach (array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST) as &$array) {
    strip_slashes_recursive($array);
}
// don't forget to unset references or it can lead to very nasty bugs
unset($array);

или даже как-то так:

if (get_magic_quotes_gpc()) {
    function undoMagicQuotes($array, $topLevel=true) {
        $newArray = array();
        foreach($array as $key => $value) {
            if (!$topLevel) {
                $key = stripslashes($key);
            }
            if (is_array($value)) {
                $newArray[$key] = undoMagicQuotes($value, false);
            }
            else {
                $newArray[$key] = stripslashes($value);
            }
        }
        return $newArray;
    }
    $_GET = undoMagicQuotes($_GET);
    $_POST = undoMagicQuotes($_POST);
    $_COOKIE = undoMagicQuotes($_COOKIE);
    $_REQUEST = undoMagicQuotes($_REQUEST);
}

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

(также хорош этот метод: PHP: как (правильно) удалить экранированные кавычки в массивах, когда включены магические кавычки )
(а также кажется, что все эти методы неполны, так как они не удаляют косые черты от всех затронутых суперглобалистов На какие суперглобалы воздействует magic_quotes_gpc = 1? )

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Вот еще один, в основном из PHP: как (правильно) удалить экранированные кавычки в массивах, когда включены магические кавычки , но с моими собственными изменениями:

if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
    function unMagicQuotify($array) {
        $fixed = array();
        foreach ($array as $key=>$val) {
            if (is_array($val)) {
                $fixed[stripslashes($key)] = unMagicQuotify($val);
            } else {
                $fixed[stripslashes($key)] = stripslashes($val);
            }
        }
        return $fixed;
    }

    $_GET = unMagicQuotify($_GET);
    $_POST = unMagicQuotify($_POST);
    $_COOKIE = unMagicQuotify($_COOKIE);
    $_REQUEST = unMagicQuotify($_REQUEST);
    $_FILES = unMagicQuotify($_FILES);
}

Pro в

  • Они работают как для массивов, так и для отдельных переменных
  • Раздевается ли ключ
  • Не использует ссылки

Con в

  • Может изменить порядок переменных

Обратите внимание на включение $ _FILES, поскольку магические кавычки также влияют на него. Что касается чтения файла (file_get_contents) и / или использования ввода php: // Я не могу сказать, влияют ли на них магические кавычки, но вам придется использовать stripslashes (), как и когда вы читаете их, и не сможете это сделать. что-то вроде этого. Мне не удалось проверить $ HTTP_RAW_POST_DATA, но он не заполнен по умолчанию, поэтому все должно быть в порядке, если не указывать.

0 голосов
/ 12 июля 2011

Вы можете избавиться от косой черты, выполнив это:

$_REQUEST = array_map('stripslashes', $_REQUEST);

Я думаю, что это проще и делает код меньше и лаконичнее.

Я уверен, что вы знаете о том, какие проблемы могут возникнуть при использовании директивы «Магические кавычки» (вот статья http://www.sitepoint.com/magic-quotes-headaches/).). Но IMO лучше перенести свои приложения на другого хостинг-провайдера в случае, если ваш текущий провайдер не может отключить магические кавычки. Также не очень хорошая идея использовать устаревшую версию PHP.

0 голосов
/ 12 июля 2011

Первый метод

Pro в

  • Они работают как для массивов, так и для отдельных переменных
  • Обнажает ли ключ

Con в

  • Код слишком длинный для того, что он должен быть

Второй метод

Pro в

  • Они работают как для массивов, так и для отдельных переменных

Con в

  • Код слишком длинный для того, что он должен быть
  • не раздевает ключ

Третий метод

Pro в

  • Они работают как для массивов, так и для отдельных переменных
  • Обнажает ли ключ

Con в

  • Код слишком длинный для того, что он должен быть

Я использую это, что работает нормально (нашел его в osTicket, мне нравится открытый код):

function strip_slashes($var){
    return is_array($var)?array_map('strip_slashes',$var):stripslashes($var);
}


if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
    $_POST = strip_slashes($_POST);
    $_GET = strip_slashes($_GET);
    $_REQUEST = strip_slashes($_REQUEST);
    $_COOKIE = strip_slashes($_COOKIE);
}

Pro в

  • Они работают как для массивов, так и для отдельных переменных

Con в

  • не раздевает ключи

Мне никогда не приходилось сталкиваться с необходимостью раздеваться. Многие библиотеки с открытым исходным кодом этого не делают (например, Wordpress, osTicket). Обычно я использую имя только для данных $ _POST и $ _GET, которые никогда не будут экранированы.

...