禁用php.ini或.htaccess禁用php魔术引号的最佳方法
我需要编写可移植代码,该代码将在启用magic_qoutes_gpc
的共享服务器上运行,并且我无法在php.ini或.htaccess中更改该代码。 (服务器运行php 5.2)
似乎有许多函数从$_GET
, $_POST
等超全球系列striplaches,但我不知道哪一个是最好的。 此处的一些评论似乎还说,关键字还添加了需要剥离的斜杠。 所以我应该使用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 - 更短的魔术行情解决方案)
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:当Magic Quotes为ON时,如何(正确)移除数组中的转义引号)
(并且似乎所有这些方法都是不完整的,因为它们不会从所有受影响的超全域植物去除斜线,哪种超全球植被受magic_quotes_gpc = 1影响?)
下面是另外一个主要来自PHP的文章:如何在Magic Quotes开启时自动更改(正确)删除数组中的转义引号:
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,但它没有默认填充,所以事情应该没问题。
您可以通过执行以下操作来消除斜杠:
$_REQUEST = array_map('stripslashes', $_REQUEST);
我认为这很容易,并使代码更小,更简洁。
我相信你知道使用魔术引号指令时会出现什么问题(这里是一篇文章http://www.sitepoint.com/magic-quotes-headaches/)。 但IMO最好将您的应用程序转移到另一个托管服务提供商,以防您的当前提供商无法关闭魔术引号。 另外,使用过时版本的PHP并不是一个好主意。
第一种方法
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数据,永远不会被转义。
链接地址: http://www.djcxy.com/p/26569.html上一篇: Best method of disabling php magic quotes without php.ini or .htaccess