PHP Conference Japan 2024

get_magic_quotes_gpc

(PHP 4, PHP 5, PHP 7)

get_magic_quotes_gpc获取 magic_quotes_gpc 的当前配置设置

警告

此函数自 PHP 7.4.0 起已弃用,自 PHP 8.0.0 起已移除。强烈建议不要依赖此函数。

描述

get_magic_quotes_gpc(): false

始终返回 false

参数

此函数没有参数。

返回值

始终返回 false

变更日志

版本 描述
7.4.0 此函数已弃用。

参见

添加注释

用户贡献的注释 9 条注释

5
eltehaem at poczta dot onet dot pl
20 年前
请注意,当 magic_quotes_gpc 设置后,不仅 $_POST、$_GET、$_REQUEST、$_COOKIE 数组的值会被加反斜杠。实际上,$GLOBALS 数组中的每个字符串值都会被加反斜杠,例如 $GLOBALS['_SERVER']['PATH_INFO'](或 $_SERVER['PATH_INFO'])。
3
hetored at gmail dot com
14 年前
以下是我想出的从请求数据中删除 magic quotes 的方法。

如果 magic_quotes_sybase 启用,则将两个单引号替换为一个,否则它只去除反斜杠。

请注意,`foreach` 样式仅在 PHP 5 及更高版本中有效。

<?php

// 从请求数据中去除 magic quotes。
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
// 创建 lambda 样式的取消转义函数(用于移植性)
$quotes_sybase = strtolower(ini_get('magic_quotes_sybase'));
$unescape_function = (empty($quotes_sybase) || $quotes_sybase === 'off') ? 'stripslashes($value)' : 'str_replace("\'\'","\'",$value)';
$stripslashes_deep = create_function('&$value, $fn', '
if (is_string($value)) {
$value = '
. $unescape_function . ';
} else if (is_array($value)) {
foreach ($value as &$v) $fn($v, $fn);
}
'
);

// 取消转义数据
$stripslashes_deep($_POST, $stripslashes_deep);
$stripslashes_deep($_GET, $stripslashes_deep);
$stripslashes_deep($_COOKIE, $stripslashes_deep);
$stripslashes_deep($_REQUEST, $stripslashes_deep);
}

?>
2
slonmron_no_spam_please_ at yahoo dot com
17 年前
关于:php at kaiundina dot de (03-Feb-2005 02:18)

1. magic_quotes_gpc=on/off 和 magic_quotes_sybase=on/off

我进行了测试,您的函数运行正确。
这些是我使用的 <input ... /> 名称
name="a"
name="b.b b\b"
name="c[c.1]"
name="c[c 2]"
name="c[c\3]"
name="c.c c[c.' 4]"
name="c ' c[c&quot;4]"
name="d&quot;[d&quot;1]"

(我使用 &quot; 因为我不知道其他方法将 " 放入名称中)

以及用户输入的值
a ' " \ \' \" \\ a

2. > 17) 当在键中使用“.”、“ ”时,它们始终被替换为“_”。

这仅适用于顶级键,如上面的“b.b b\b”、“c.c c”和“c ' c”。二级键“[c.' 4]”没有更改为 [c_'_4],而是根据 magic_quites_XXX 的设置进行了转义。

在 PHP 4.4.0 上测试。

这些 magic_quotes 真是黑魔法 :(

最好对 $_SESSION 进行测试,但我今天做不到。
1
php at kaiundina dot de
19 年前
GPC 数组中键字符串的转义行为与它们的值转义行为不同。

起初我预计提交的 GPC 数组中的键永远不会被转义。
无论如何。在我看到转义的键后,我假设它们是根据 magic quotes 的设置转义的。
... 情况更糟...

我花了 2 天多的时间进行测试,才弄清楚确切的行为并创建了两个函数(每个 PHP 版本一个),这些函数可以可靠地从提交给脚本的任何数组中去除反斜杠。希望这能节省一些人的时间和神经。

以下适用于 $_GET 和 $_POST 数组。我希望受 magic quotes 影响的其他数组的行为也相同。
我没有测试 magic_quotes_sybase 设置时的行为。

== 可能的案例组合的图例 ==
Px = 我们正在使用的 PHP 版本
P4 = php 4.3.9
P5 = php 5.0.2

MQ = MagicQuotes GPC
+MQ = magic quotes 启用
-MQ = magic quotes 禁用

TL = 顶级键
+TL = 键位于顶级(即 $_GET['myKey'])
-TL = 键嵌套在另一个数组中(即 $_GET['myList']['myKey'])

AK = 数组键
+AK = 键的值是另一个数组(即 is_array($_GET['myKey']) == true)
-AK = 值是普通字符串(即 is_string($_GET['myKey']) == true)

== 可能结果的图例 ==
KE = 键转义
+KE = 控制字符以反斜杠为前缀
-KE = 键按提交时的状态返回,无需去除

VE = 值转义(不适用于数组作为值)
+VE = 控制字符以反斜杠为前缀
-VE = 值按提交时的状态返回,无需去除

== 我们开始吧 - 以下规则适用 ==
1) P4 +MQ +AK +TL --> -KE
2) P4 +MQ +AK -TL --> +KE
3) P4 +MQ -AK +TL --> -KE +VE
4) P4 +MQ -AK -TL --> +KE +VE
5) P4 -MQ +AK +TL --> -KE
6) P4 -MQ +AK -TL --> -KE


7) P4 -MQ -AK +TL --> -KE -VE
8) P4 -MQ -AK -TL --> -KE -VE
9) P5 +MQ +AK +TL --> -KE
10) P5 +MQ +AK -TL --> +KE
11) P5 +MQ -AK +TL --> +KE +VE
12) P5 +MQ -AK -TL --> +KE +VE
13) P5 -MQ +AK +TL --> -KE
14) P5 -MQ +AK -TL --> -KE
15) P5 -MQ -AK +TL --> +KE -VE
16) P5 -MQ -AK -TL --> +KE -VE
17) 字符“.” 和“ ”在用作键时始终会被替换为“_”。

示例(规则 15)
在 PHP 5.0.2 下运行且禁用 magic_quotes 时,顶层包含字符串的 gpc 键会被转义,而其关联的值不会被转义。

== 以下函数将为 PHP 4.3.9 剥离 GPC 数组 ==

<?php
function transcribe($aList, $aIsTopLevel = true) {
$gpcList = array();
$isMagic = get_magic_quotes_gpc();

foreach (
$aList as $key => $value) {
$decodedKey = ($isMagic && !$aIsTopLevel)?stripslashes($key):$key;
if (
is_array($value)) {
$decodedValue = transcribe($value, false);
} else {
$decodedValue = ($isMagic)?stripslashes($value):$value;
}
$gpcList[$decodedKey] = $decodedValue;
}
return
$gpcList;
}
?>


== 以下函数将为 PHP 5.0.2 剥离 GPC 数组 ==
<?php
function transcribe($aList, $aIsTopLevel = true) {
$gpcList = array();
$isMagic = get_magic_quotes_gpc();

foreach (
$aList as $key => $value) {
if (
is_array($value)) {
$decodedKey = ($isMagic && !$aIsTopLevel)?stripslashes($key):$key;
$decodedValue = transcribe($value, false);
} else {
$decodedKey = stripslashes($key);
$decodedValue = ($isMagic)?stripslashes($value):$value;
}
$gpcList[$decodedKey] = $decodedValue;
}
return
$gpcList;
}
?>

用法

<?php
$unstrippedGET
= transcribe($_GET);
$unstrippedPOST = transcribe($_POST);
?>

也许有人愿意测试这些组合在其他 PHP 版本以及 magic_quotes_sybase 设置为“on”时的效果 - 请告诉我。
抱歉文本量很大,但这是完整的。我无法将决策表压缩得更小了。
0
[email protected]
16 年前
<?php
function stripper($stringvar){
if (
1 == get_magic_quotes_gpc()){
$stringvar = stripslashes($stringvar);
}
return
$stringvar;
}
?>

用法

<?php
$Body
= stripper($rs->fields('Body'));
echo(
$Body);
?>

此函数检查 get_magic_quotes_gpc() 是否开启,如果开启则剥离输出的字符串变量。如果开发服务器和生产服务器的设置不同,则很有用。
0
[email protected]
16 年前
@ ... [email protected]

我建议用“stripslashes_deep”替换 foreach。

示例 2 对数组使用 stripslashes()
<https://php.net/manual/en/function.stripslashes.php>:

<?php
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);

return
$value;
}
?>

这将给出

<?php
if((function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc()) || (ini_get('magic_quotes_sybase') && (strtolower(ini_get('magic_quotes_sybase'))!="off")) ){
stripslashes_deep($_GET);
stripslashes_deep($_POST);
stripslashes_deep($_COOKIE);
}
?>
0
[email protected]
18 年前
当您使用表单和数据库时,您应该使用此概念

1.将用户输入插入数据库时,使用 add_slashes() 或类似函数转义 $_POST/$_GET(以匹配特定的数据库转义规则)

$query='INSERT INTO users SET fullname="'.add_slashes($_POST['fullname']).'"';
insert_into_db($query);

2.从数据库读取之前提交的输入时,使用 html_special_chars 显示转义的结果!

read_db_row('SELECT fullname FROM users');
echo '<input type="text" name="fullname" value="'.html_special_chars($db_row['fullname']).'" />

这样您就可以安全地存储和处理原始(未转义)数据。
-1
... [email protected]
16 年前
一个小小的修正
(因为 ini_get 函数可能会返回“off”的字符串值,该值会被评估为 TRUE)
<?php
if(
(
function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc() )
|| (
ini_get('magic_quotes_sybase') && ( strtolower(ini_get('magic_quotes_sybase')) != "off" ) )
){
foreach(
$_GET as $k => $v) $_GET[$k] = stripslashes($v);
foreach(
$_POST as $k => $v) $_POST[$k] = stripslashes($v);
foreach(
$_COOKIE as $k => $v) $_COOKIE[$k] = stripslashes($v);
}
?>
-3
w3dk
9 年前
>“如果指令 magic_quotes_sybase 为 ON,它将完全覆盖 magic_quotes_gpc。”

这个“注释”有点误导。只有在 magic_quotes_gpc 已启用时,magic_quotes_sybase 才会覆盖 Get/Post/Cookie 数据使用的转义方法。如果 magic_quotes_gpc 未启用,则 magic_quotes_sybase 在此处无效。



因此,其他一些评论在确定何时从输入中“去除反斜杠”时是不正确的,它们在 magic_quotes_gpc 或 magic_quotes_sybase 启用时“去除反斜杠”。你应该只在 magic_quotes_gpc 启用时使用 stripslashes(),因为只有在这种情况下才会自动添加反斜杠。

stripslashes() 也支持 magic_quotes_sybase,因此当 magic_quotes_sybase 启用时,你无需执行任何特殊操作(例如,像另一条评论建议的那样编写自定义函数来处理这种情况)。当 magic_quotes_sybase 启用时,stripslashes() 实际上不会去除任何反斜杠,而是取消转义仅使用单引号转义的单引号。

但是,magic_quotes_sybase 会影响 addslashes() 和 stripslashes() 分别使用的转义(和取消转义)方法,而不管 magic_quotes_gpc(或 magic_quotes_runtime)是否启用。
To Top