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

Я хочу отключить магические цитаты 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'), но это не повлияло.

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

Ответ 1

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

-

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

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

ИЗМЕНИТЬ

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

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

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

Ответ 2

Пока я не могу сказать, почему php_flag дает вам 500 Internal Server Error s, я укажу, что в руководстве 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);
}
?>

Ответ 3

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

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

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

    magic_quotes_gpc = Off
    magic_quotes_runtime = Off
    magic_quotes_sybase = Off
    extension = pdo.so
    расширение = pdo_mysql.so

  • Сохраните его в каталоге/файлах, в которых выполняются ваши скрипты.

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

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

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

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

Ответ 4

php_flag и php_value внутри файла .htaccess являются технически правильными, но PHP установлен только как модуль Apache. На общем хосте вы почти никогда не найдете такую ​​настройку; Вместо этого PHP запускается как CGI по причинам, связанным с безопасностью (поддерживая соседние серверы из ваших файлов) и тем, как phpuexec запускает сценарии как "вы", а не пользователь 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

======================== =============== МОЕ РЕШЕНИЕ =============================================================== (переименуйте 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.)

Ответ 6

Если вы используете 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);
}

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

Ответ 7

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

Ответ 8

Я знаю, что опаздываю, чтобы ответить на этот вопрос, но я прочитал большинство ответов, и хотя многие из них были замечательными, только 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 ошибок. После этого просто примените то, что сказал Питер Бейли.

Ответ 9

У разных хостинг-провайдеров есть разные процедуры для этого, поэтому я хотел бы спросить на их форумах или подать запрос на поддержку.

Если вы не можете отключить их, вы всегда можете использовать что-то вроде этого, которое будет избегать ввода независимо от того, включены или отключены магические кавычки:

//using mysqli

public function escapeString($stringToBeEscaped) {

    return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped));
}

Ответ 10

  • Это работает, если вы удалите строку AddType? Я не совсем уверен, почему это важно для того, чтобы превратить магию в кавычки.

  • Если PHP не работает под mod_php, htaccess не будет работать. Он работает как CGI?

Это действительно для вашей хостинговой компании.

Ответ 11

Ответ на 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 );
}

Это более защитный.

Ответ 12

Как насчет $_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); 
}

Ответ 13

Если вы не можете отключить его, вот что я обычно делаю:

get_magic_quotes_gpc() ? $_POST['username'] : mysql_real_escape_string($_POST['username']);

Он будет помещен в базу данных в соответствующем формате.