在没有php.ini或.htaccess的情况下禁用php魔术引号的最佳方法
我需要编写可移植代码,该代码将在启用了在没有php.ini或.htaccess的情况下禁用php魔术引号的最佳方法,php,magic-quotes-gpc,Php,Magic Quotes Gpc,我需要编写可移植代码,该代码将在启用了magic\u qoutes\u gpc的共享服务器上运行,我无法在php.ini或.htaccess中更改该代码。(服务器正在运行PHP5.2) 似乎有很多函数可以从所有超全局的$\u GET,$\u POST等中删除slaches,但我不确定哪一个是最好的。还有一些评论似乎说,这些键还添加了斜杠,这些斜杠也需要去掉。因此,我应该使用PHP网站上的一个: if (get_magic_quotes_gpc()) { $process = array(
magic\u qoutes\u gpc
的共享服务器上运行,我无法在php.ini或.htaccess中更改该代码。(服务器正在运行PHP5.2)
似乎有很多函数可以从所有超全局的$\u GET
,$\u POST
等中删除slaches,但我不确定哪一个是最好的。还有一些评论似乎说,这些键还添加了斜杠,这些斜杠也需要去掉。因此,我应该使用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);
}
或者类似的:(从这个答案:)
甚至像这样:
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);
}
是否有人能解释每种方法和/或完全不同的方法的优缺点,以及它们有多彻底,以及它们是否从关键点和价值中删除了斜杠
(这种方法有用吗:)(而且似乎所有这些方法都是不完整的,因为它们没有从所有受影响的超全局删除斜线)第一种方法 Pro's
- 它们适用于数组和单变量
- 你把钥匙拿走了吗
- 代码太长,无法满足需要
- 它们适用于数组和单变量
- 代码太长,无法满足需要
- 不剥掉钥匙
- 它们适用于数组和单变量
- 你把钥匙拿走了吗
- 代码太长,无法满足需要
- 它们适用于数组和单变量
- 不剥掉钥匙
- 它们适用于数组和单变量
- 你把钥匙拿走了吗
- 代码太长,无法满足需要
- 它们适用于数组和单变量
- 代码太长,无法满足需要
- 不剥掉钥匙
- 它们适用于数组和单变量
- 你把钥匙拿走了吗
- 代码太长,无法满足需要
- 它们适用于数组和单变量
- 不剥掉钥匙
不过,我从未遇到过同样需要剥掉钥匙的情况。许多开源库不这样做(例如Wordpress、osTicket)。通常,我只为$\u POST和$\u GET数据使用名称,这些数据将永远不会转义。您可以通过执行以下操作来消除斜杠:
$_REQUEST = array_map('stripslashes', $_REQUEST);
我认为这更容易,使代码更小,更简洁
我相信您知道在使用magic quotes指令时可能出现的问题(以下是一篇文章)。但在我看来,最好是你把你的应用转移到另一个主机提供商,以防你当前的提供商无法关闭magic quotes。另外,使用过时的PHP版本也不是个好主意 您可以通过执行以下操作来消除斜杠:
$_REQUEST = array_map('stripslashes', $_REQUEST);
我认为这更容易,使代码更小,更简洁
我相信您知道在使用magic quotes指令时可能出现的问题(以下是一篇文章)。但在我看来,最好是你把你的应用转移到另一个主机提供商,以防你当前的提供商无法关闭magic quotes。另外,使用过时的PHP版本也不是个好主意 这里是另一个主要来自但有我自己的变化:
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's
- 它们适用于数组和单变量
- 你把钥匙拿走了吗
- 不使用引用
- 可能会改变变量的顺序
至于读取文件(文件获取内容)和/或使用php://input 我不知道魔法引号是否会影响它们,但是当你阅读它们时,你必须使用stripslashes(),而不能这样做。我没有检查$HTTP\u RAW\u POST\u数据,但默认情况下它没有填充,所以不使用它应该没问题。这里是另一个主要由我自己更改的数据:
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's
- 它们适用于数组和单变量
- 你把钥匙拿走了吗
- 不使用引用
- 可能会改变变量的顺序
至于读取文件(文件获取内容)和/或使用php://input 我不知道魔法引号是否会影响它们,但是当你阅读它们时,你必须使用stripslashes(),而不能这样做。我没有检查$HTTP_RAW_POST_数据,但默认情况下它没有填充,所以不检查应该没问题。对不起,你能解释一下每个方法的优缺点吗?比较一下,而不是作为一个整体,我不太清楚你说的“最简单的方式:…”是什么意思。你的方法是否删除了斜杠