Вопрос по runtime, php, magic-quotes – Как я могу отключить магические кавычки PHP во время выполнения?

9

Я пишу набор сценариев PHP, которые будут запускаться в нескольких различных установках, некоторые из них - на виртуальном хостинге с волшебными кавычками (ужас). Без возможности контролировать конфигурацию PHP или Apache, могу ли я что-нибудь сделать в своих скриптах, чтобы отключить кавычки PHP во время выполнения?

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

Ваш Ответ

4   ответа
1

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
}

Обрабатывает ключи, значения и многомерные массивы.

@ Брайан Э .: Спасибо за ваш отзыв, вы правы - я пропустил эту большую деталь!
@Brian E: я опубликовал возможное исправление вgithub.com/alixaxel/phunction/issues/1#issuecomment-1039664.,
Это работает, но оно также удалит косые черты от других экранированных символов, таких как \ r и \ n, и становится "r" и & quot; n & quot; в стоимости.
2

похожий на Gumbo (но, конечно, мне больше нравится мой :):

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime())
    set_magic_quotes_runtime(false);

if(get_magic_quotes_gpc()) {
    array_stripslashes($_POST);
    array_stripslashes($_GET);
    array_stripslashes($_COOKIES);
}

function array_stripslashes(&$array) {
    if(is_array($array))
        while(list($key) = each($array))
            if(is_array($array[$key]))
                array_stripslashes($array[$key]);
            else
                $array[$key] = stripslashes($array[$key]);
}
... но как насчет ситуации, когда вы размещаете контент, который включает косые черты, которые ДОЛЖНЫ быть там, и вы не хотите, чтобы они удалялись?
@dsdsdsdsd: обработано. Косые черты удаляются только в том случае, если включен magic_quotes_gpc, поэтому в вашей ситуации сами косые черты будут заключены в кавычки и будут преобразованы обратно в косые черты с помощью этого кода.
Очень полезно как временное решение до обновления 5.3 (с конфигурацией по умолчанию этой директивы). Не требует каких-либо других модификаций кода. Ницца. Спасибо.
15

magic_quoted_runtime может быть отключен во время выполнения. Ноmagic_quotes_gpc нельзя отключить во время выполнения (PHP_INI_ALL изменяемый до PHP 4.2.3, с тех порPHP_INI_PERDIR); Вы можете только удалить их:

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);
}

Для получения дополнительной информации см.Отключение магических кавычек.

Это выглядит великолепно, спасибо! Adam Acheron
что делать, если вы хотите, чтобы оставались некоторые косые черты ... например, контент, введенный в форму, которая содержит дробь: 4/5 ... полоски убрали бы ее
@dsdsdsdsdstripslashes удаляет обратную косую черту
Я действительно думаю, что этот код должен такжеini_set('magic_quotes_gpc', false); чтобы другая библиотека, которая также была обеспокоена чередованием входных значений, не удаляла их снова.
@gnarf: Это было бы мило, но, к сожалению, это не сработает, если вы попробуетеini_set('magic_quotes_gpc', 0) ты получишьfalse каждый раз, так как это выполнимо только вPHP_INI_PERDIR.
5

но вы можете использовать файл .htaccess в каталоге, чтобы отключить его.

php_flag magic_quotes_gpc off

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

Да, это требует настройки сервера для разрешения переопределения .htaccess. Жаль слышать, что это не сработало для вас.
Внутренняя ошибка сервера. Похоже, что хост не разрешает эту директиву. :( Adam Acheron

Похожие вопросы