我需要编写可在启用了magic_qoutes_gpc
的共享服务器上运行的可移植代码,我无法在php.ini或.htaccess中更改它。 (服务器正在运行php 5.2)
似乎所有$_GET
,$_POST
等超级全球的剥离有很多功能,但我不确定哪种是最好的。还有一些评论here似乎说密钥也有添加的斜杠,也需要剥离。我应该使用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)
(并且看起来所有这些方法都不完整,因为它们不会从所有受影响的超级全球中删除斜线Which superglobals are affected by magic_quotes_gpc = 1?)
答案 0 :(得分:1)
这是另一个主要来自PHP: how to (correctly) remove escaped quotes in arrays when Magic Quotes are ON但又有我自己的变化:
if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
function unMagicQuotify($array) {
$fixed = array();
foreach ($array as $key=>$val) {
if (is_array($val)) {
$fixed[stripslashes($key)] = unMagicQuotify($val);
} else {
$fixed[stripslashes($key)] = stripslashes($val);
}
}
return $fixed;
}
$_GET = unMagicQuotify($_GET);
$_POST = unMagicQuotify($_POST);
$_COOKIE = unMagicQuotify($_COOKIE);
$_REQUEST = unMagicQuotify($_REQUEST);
$_FILES = unMagicQuotify($_FILES);
}
<强> Pro的强>
<强>精读的强>
请注意,包含$ _FILES作为魔术引号也会影响它。 至于阅读文件(file_get_contents)和/或使用php://输入我无法判断魔术引号是否会影响它们,但是当你阅读它们时你必须使用stripslashes()并且无法做到这样的事情。我没有设法检查$ HTTP_RAW_POST_DATA,但默认情况下它没有填充,所以事情应该没问题就可以了。
答案 1 :(得分:0)
第一种方法
的 Pro的强> 的
的精读的强> 的
第二种方法
的 Pro的强> 的
的精读的强> 的
第三种方法
的 Pro的强> 的
的精读的强> 的
我一直在使用它,它运行正常(在osTicket中找到它,我喜欢开源):
function strip_slashes($var){
return is_array($var)?array_map('strip_slashes',$var):stripslashes($var);
}
if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
$_POST = strip_slashes($_POST);
$_GET = strip_slashes($_GET);
$_REQUEST = strip_slashes($_REQUEST);
$_COOKIE = strip_slashes($_COOKIE);
}
的 Pro的强> 的
的精读的强> 的
我从来没有遇到过剥离钥匙的需要。许多开源库都没有这样做(例如Wordpress,osTicket)。通常我只使用永远不会被转义的$ _POST和$ _GET数据的名称。
答案 2 :(得分:0)
你可以通过执行以下操作来摆脱斜杠:
$_REQUEST = array_map('stripslashes', $_REQUEST);
我认为它更容易,使代码更小,更简洁。
我确定你知道在使用魔术引号指令时会出现什么问题(这是一篇文章http://www.sitepoint.com/magic-quotes-headaches/)。但IMO最好将您的应用程序移动到另一个托管服务提供商,以防您当前的提供商无法关闭魔术报价。此外,使用过时的PHP版本并不是一个好主意。