我需要编写将在magic_qoutes_gpc
启用的共享服务器上运行的可移植代码,我无法在 php.ini 或 .htaccess 中更改它。(服务器正在运行 php 5.2)
似乎有很多函数可以从所有$_GET
,$_POST
等超全局变量中剥离,但我不确定哪个是最好的。此外,这里的一些评论似乎说这些键还添加了斜杠,这些斜杠也需要被剥离。所以我应该使用 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 - Shorter Magic Quotes Solution)
function strip_slashes_recursive(&$value) {
if (!is_array($value)) {
$value = strip_slashes($value);
} else {
foreach (array_keys($value) as $key) {
$arrayValue = strip_slashes_recursive($value[$key]);
unset($value[$key]);
$value[strip_slashes($key)] = $arrayValue;
}
}
}
foreach (array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST) as &$array) {
strip_slashes_recursive($array);
}
// don't forget to unset references or it can lead to very nasty bugs
unset($array);
甚至是这样的:
if (get_magic_quotes_gpc()) {
function undoMagicQuotes($array, $topLevel=true) {
$newArray = array();
foreach($array as $key => $value) {
if (!$topLevel) {
$key = stripslashes($key);
}
if (is_array($value)) {
$newArray[$key] = undoMagicQuotes($value, false);
}
else {
$newArray[$key] = stripslashes($value);
}
}
return $newArray;
}
$_GET = undoMagicQuotes($_GET);
$_POST = undoMagicQuotes($_POST);
$_COOKIE = undoMagicQuotes($_COOKIE);
$_REQUEST = undoMagicQuotes($_REQUEST);
}
有人可以解释每种方法的优缺点和/或完全不同的方法以及它们的彻底性以及它们是否从键和值中去除斜线。
(这种方法也有用吗:PHP: how to (correctly) remove escaped quotes in arrays when Magic Quotes are ON)
(而且似乎所有这些方法都不完整,因为它们没有从所有受影响的超全局变量中删除斜杠哪些超全局变量受 magic_quotes_gpc = 1 影响?)