我正在编写一组 PHP 脚本,它们将在一些不同的设置中运行,其中一些共享主机并带有魔术引号(恐怖)。如果无法控制 PHP 或 Apache 配置,我可以在我的脚本中做任何事情来在运行时禁用 PHP 引号吗?
如果代码没有假设魔术引号打开会更好,这样我就可以在可能有或没有魔术引号的不同主机上使用相同的脚本。
我正在编写一组 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 的小脚本(但我当然更喜欢我的 :):
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);
}
处理键、值和多维数组。
它不能在运行时完成:(