Я хочу отключить магические цитаты 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 (по причинам, уже указанным Питом Бейли), просто:
Добавить строки
magic_quotes_gpc = Выкл.
magic_quotes_runtime = Выкл.
magic_quotes_sybase = Выкл.
расширение = pdo.so
расширение = pdo_mysql.so
Сохраните его в директориях, в которых выполняются ваши скрипты.
Обновление: если вы хотите иметь только одну копию нового файла 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)); }
Он работает, если вы удалите строку AddType? Я не совсем понимаю, почему это важно для того, чтобы отключить магические цитаты.
Если 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']);
Он будет помещен в базу данных в соответствующем формате.