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

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

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

В соответствии с руководством вы часто можете установить собственный 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, чтобы сделать это – ИЛИ – реализовать скрипт для изменения эффектов магических котировок. Что-то вроде этого

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

Хотя я не могу сказать, почему 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); } ?> с <?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 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); } ?> 

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

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

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

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

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

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

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

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

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

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.

======================= === =================== (переименуйте 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 

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

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

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

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

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

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

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

 //using mysqli public function escapeString($stringToBeEscaped) { return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped)); } 
  1. Он работает, если вы удалите строку AddType? Я не совсем понимаю, почему это важно для того, чтобы отключить магические цитаты.

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

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

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

Он более защищен.

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

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

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

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