Как я могу отключить магические кавычки PHP во время выполнения? - PullRequest
9 голосов
/ 20 июля 2009

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

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

Ответы [ 5 ]

15 голосов
/ 20 июля 2009

Только 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);
}

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

5 голосов
/ 20 июля 2009

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

php_flag magic_quotes_gpc off

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

2 голосов
/ 20 июля 2009

У меня есть маленький сценарий для этого, похожий на 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]);
}
1 голос
/ 17 января 2010

Еще одно решение для PHP 5.3 +:

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

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

0 голосов
/ 20 июля 2009

Это невозможно сделать во время выполнения: (

...