Как отключить магические кавычки на виртуальном хостинге? - PullRequest
41 голосов
/ 05 февраля 2009

Я хочу отключить магические кавычки PHP. У меня нет доступа к php.ini.

Когда я пытался добавить php_flag magic_quotes_gpc off в мой файл .htaccess, я получаю внутреннюю ошибку 500 сервера. Вот как выглядит мой файл .htaccess:

AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off

Затем я попытался использовать ini_set('magic_quotes_gpc', 'O'), но это не дало результата.

Как отключить магические кавычки?

Ответы [ 13 ]

42 голосов
/ 05 февраля 2009

Согласно руководству вы часто можете установить пользовательский php.ini на виртуальном хостинге, где mod_php не используется и директива php_value приводит к ошибке. Для установок suexec / FastCGI в каждом случае достаточно иметь пространство для каждого php.ini.

-

Я не думаю, что O (заглавная буква o) является допустимым значением для установки флага ini. Вам необходимо использовать значения true / false, 1/0 или «on» / «off».

ini_set( 'magic_quotes_gpc', 0 );   // doesn't work

EDIT

После проверки списка настроек ini я вижу, что magic_quotes_gpc является настройкой PHP_INI_PERDIR (после 4.2.3), что означает, что вы не можете изменить ее с помощью ini_set() (только * 1020) * настройки можно изменить с помощью ini_set())

Это означает, что вы должны использовать файл .htaccess, чтобы сделать это - ИЛИ - реализовать скрипт, чтобы обратить вспять эффекты магических кавычек. Как то так

if ( in_array( strtolower( ini_get( 'magic_quotes_gpc' ) ), array( '1', 'on' ) ) )
{
    $_POST = array_map( 'stripslashes', $_POST );
    $_GET = array_map( 'stripslashes', $_GET );
    $_COOKIE = array_map( 'stripslashes', $_COOKIE );
}
30 голосов
/ 06 февраля 2009

Хотя я не могу сказать, почему php_flag дает вам 500 Internal Server Error с, я укажу, что в руководстве по PHP есть пример определения, включены ли магические кавычки, и извлечения его из суперглобальных элементов в во время выполнения. В отличие от других опубликованных, этот является рекурсивным и корректно удаляет кавычки из массивов:

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

Старая версия:

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>

Новая версия:

<?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);
}
?>
20 голосов
/ 10 мая 2012

Это решит проблему получения «PDO класса не найден» при создании локального файла php.ini.

Если вы не можете отключить магические кавычки с помощью файла htaccess (по причинам, уже указанным Питом Бэйли), просто:

  1. Создать текстовый файл
  2. Переименуйте его в 'php.ini'
  3. Добавить строки

    magic_quotes_gpc = Выкл.
    magic_quotes_runtime = выкл.
    magic_quotes_sybase = Off
    extension = pdo.so
    расширение = pdo_mysql.so

  4. Сохраните его в директории, в которой выполняются ваши сценарии.

Обновление: если вы хотите иметь только одну копию нового файла php.ini, добавьте эту строку в ваш корневой файл .htaccess:

SetEnv PHPRC /path/to/site/root/public_html/php.ini

Очевидно, вам нужно переместить INI-файл в это место, где его еще нет.

Надеюсь, это спасет кого-то за 2 часа, которые у меня ушли!

10 голосов
/ 07 февраля 2009

php_flag и php_value в файле .htaccess технически правильны - но для PHP, установленного только как модуль Apache. На общем хосте вы почти никогда не найдете такой настройки; Вместо этого PHP запускается как CGI по причинам, связанным с безопасностью (не позволяющей соседям по серверу исключать ваши файлы) и тем, как phpsuexec запускает сценарии как «вы» вместо пользователя apache.

Таким образом, Apache корректен и выдает ошибку сервера: он не знает о значении php_flag, пока не загружен модуль PHP. Двоичный файл CGI предназначен для Apache внешней программы, и вы не можете настроить его из Apache.

Теперь хорошие новости: вы можете настроить конфигурацию для каждого каталога, поместив туда файл с именем ' php.ini ' и установив там свои инструкции, используя тот же синтаксис, что и в основном php.ini системы. , В руководстве по PHP перечислены все устанавливаемые директивы: вы можете установить те, которые отмечены как PHP_INI_PERDIR или PHP_INI_ALL, в то время как только системный администратор может установить те, которые отмечены как PHP_INI_SYSTEM в php.ini всего сервера.

Обратите внимание, что такие директивы php.ini не наследуются подкаталогами, вам придется предоставить им собственный php.ini.

5 голосов
/ 16 сентября 2013

======================== =============== МОЕ РЕШЕНИЕ ============================ (переименуйте свой php.ini в php5.ini)

и в верхней части (!) Добавьте:

magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.so

затем в .htaccess добавьте это (вверху):

SetEnv PHPRC /home/your_path/to/public_html/php5.ini

p.s. измените /home/your_path/to/ правильно (вы можете увидеть этот путь, выполнив команду <?php phpinfo(); ?> из типичного файла .php.)

2 голосов
/ 17 января 2010

Если вы работаете с PHP 5.3+, это сработает, поместите его в самый верх вашей страницы:

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
}

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

1 голос
/ 19 ноября 2012

Я знаю, что опаздываю, чтобы ответить на этот вопрос, но я прочитал большинство ответов, и хотя многие из них были замечательными, только djn фактически объяснил почему вы получили это 500 Internal Server Error ,

Хотя его объяснение было на 100% правильным, это прекрасный пример того, почему вы всегда должны заключать их в <IfModule>. Хотя это не решит реальную проблему невозможности установить эти флаги в .htaccess, , по крайней мере, предотвратит ошибку 500 .

<IfModule mod_php5.c>
    # put all of your php_flags here, for example:
    php_flag magic_quotes_gpc off
</IfModule>

Или для более старых версий это будет <IfModule mod_php.c> и т. Д.

Я стараюсь всегда делать это так, чтобы избежать любых таких 500 ошибок. После этого просто примените то, что сказал Питер Бейли .

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

, если ваш хостинг-провайдер использует cpanel, Вы можете попробовать скопировать php.ini в ваш веб-каталог. и отредактируйте его с помощью magic_quotes_gpc = off

0 голосов
/ 05 апреля 2011

Как насчет $_SERVER?

if (get_magic_quotes_gpc() === 1) {

    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); 
    $_SERVER = json_decode( stripslashes(json_encode($_SERVER,JSON_HEX_APOS)), true); 
}
0 голосов
/ 06 февраля 2009

Ответ BaileyP уже довольно хорош, но я бы использовал это условие:

if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() === 1){
  $_POST = array_map( 'stripslashes', $_POST );
  $_GET = array_map( 'stripslashes', $_GET );
  $_COOKIE = array_map( 'stripslashes', $_COOKIE );
}

Это более оборонительно.

...