Я пишу набор PHP-скриптов, которые будут запускаться в разных настройках, некоторые из них используют общий хостинг с магическими кавычками (ужас). Не имея возможности управлять настройкой PHP или Apache, могу ли я сделать что-нибудь в своих сценариях, чтобы отключить цитаты из PHP во время выполнения?
Было бы лучше, если бы код не предполагал, что магические кавычки включены, так что я могу использовать те же сценарии на разных хостах, которые могут иметь или не иметь магические кавычки.
Только magic_quoted_runtime можно отключить во время выполнения. Но magic_quotes_gpc не может быть отключен во время выполнения ( PHP_INI_ALL сменяется до PHP 4.2.3, с тех пор PHP_INI_PERDIR ); вы можете удалить их только:
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); }
Дополнительную информацию см. В разделе « Отключение магических котировок» .
Магические кавычки не могут быть отключены во время выполнения, но вы можете использовать файл .htaccess в каталоге, чтобы отключить его.
php_flag magic_quotes_gpc off
Единственное реальное преимущество – вы можете поместить его один раз в каталог, и он работает для всего каталога и подкаталогов. Действительно приятно, если вам это нужно для приложения, которое вы не пишете, и нужно заставить его работать без магических кавычек.
У меня есть небольшой сценарий для этого, похожего на Gumbo's (но, конечно, мне нравится моя лучше :):
if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) set_magic_quotes_runtime(false); if(get_magic_quotes_gpc()) { array_stripslashes($_POST); array_stripslashes($_GET); array_stripslashes($_COOKIES); } function array_stripslashes(&$array) { if(is_array($array)) while(list($key) = each($array)) if(is_array($array[$key])) array_stripslashes($array[$key]); else $array[$key] = stripslashes($array[$key]); }
Другое решение для PHP 5.3+:
if (get_magic_quotes_gpc() === 1) { $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true); $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true); $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); }
Обрабатывает ключи, значения и многомерные массивы.
Это невозможно сделать во время выполнения 🙁