我正在编写一组PHP脚本,这些脚本将在一些不同的设置中运行,其中一些与魔术引号共享托管(恐怖)。如果没有控制PHP或Apache配置的能力,我可以在脚本中做任何事情来在运行时禁用PHP引用吗?
如果代码没有假设魔术引号打开,那就更好了,这样我就可以在不同的主机上使用相同的脚本,这些主机可能有也可能没有魔术引号。
答案 0 :(得分:15)
运行时只能禁用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);
}
有关详细信息,请参阅Disabling Magic Quotes。
答案 1 :(得分:5)
在运行时无法禁用魔术引号,但您可以使用目录中的.htaccess文件将其禁用。
php_flag magic_quotes_gpc off
唯一真正的优点是你可以把它放在一个目录中,它适用于整个目录和子目录。非常好,如果你需要这个你没有写的应用程序,并且需要让它在没有魔术引号的情况下工作。
答案 2 :(得分:2)
我有一个类似于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]);
}
答案 3 :(得分:1)
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);
}
处理键,值和多维数组。
答案 4 :(得分:0)
无法在运行时完成:(