Как отключить магические кавычки на виртуальном хостинге?
Я хочу отключить магические цитаты 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 ответов
Согласно инструкции, вы часто можете установить собственный 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
РЕДАКТИРОВАТЬ
После проверки списка настроек 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);
}
?>
Это решит проблему получения "Class 'PDO' not found" при создании локального файла php.ini.
Если вы не можете отключить магические кавычки с помощью файла htaccess (по причинам, уже указанным Питом Бэйли), просто:
- Создать текстовый файл
- Переименуйте его в php.ini
Добавьте строки
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
расширение =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 по причинам, связанным с безопасностью (не позволяющей соседям по серверу исключать ваши файлы) и тем, как 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.
======================== =============== МОЕ РЕШЕНИЕ ========= =================== (переименуйте ваш 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);
}
Обрабатывает ключи, значения и многомерные массивы.
Я знаю, что опаздываю, чтобы ответить на этот вопрос, но я прочитал большинство ответов, и хотя многие из них были великолепны, только 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 таких ошибок. После этого просто примените то, что сказал Питер Бейли.
Если ваш хостинг-провайдер использует cpanel, вы можете попробовать скопировать php.ini в ваш веб-каталог и отредактировать его с помощью magic_quotes_gpc = off.
Разные хостинг-провайдеры имеют разные процедуры для этого, поэтому я бы попросил на их форумах или подать запрос в службу поддержки.
Если вы не можете их отключить, вы всегда можете использовать что-то вроде этого, которое будет избегать ввода независимо от того, включены ли магические кавычки:
//using mysqli
public function escapeString($stringToBeEscaped) {
return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped));
}
Как насчет $_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);
}
Работает ли это, если вы удалите строку 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 );
}
Это более оборонительно.
Если вы не можете выключить его, вот что я обычно делаю:
get_magic_quotes_gpc() ? $_POST['username'] : mysql_real_escape_string($_POST['username']);
Он будет помещен в базу данных в правильном формате.