2024 PHP Conference Japan

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 則註解

eltehaem at poczta dot onet dot pl
20 年前
請注意,當 magic_quotes_gpc 設定為啟用時,不僅 $_POST、$_GET、$_REQUEST、$_COOKIE 陣列的值會被加上反斜線。實際上,$GLOBALS 陣列中的每個字串值都會被加上反斜線,例如 $GLOBALS['_SERVER']['PATH_INFO'](或 $_SERVER['PATH_INFO'])。
hetored at gmail dot com
14 年前
以下是我想出的從請求資料中移除魔術引號的方法。

如果 magic_quotes_sybase 啟用,則將兩個單引號替換為一個,否則只移除反斜線。

請注意,`foreach` 的風格使得這只適用於 PHP 5 及以上版本。

<?php

// 從請求資料中移除魔術引號。
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);
}

?>
slonmron_no_spam_please_ at yahoo dot com
17 年前
回覆:php at kaiundina dot de (2005年2月3日 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 上測試。

這些魔術引號真的是黑魔法 :(

最好針對 $_SESSION 進行測試,但我今天沒辦法做。
php at kaiundina dot de
19 年前
GPC 陣列中鍵值字串的跳脫行為與其值的跳脫行為不同。

一開始我預期提交的 gpc 陣列中的鍵值永遠不會被跳脫。
無論如何,在我看到被跳脫的鍵值後,我假設它們是根據魔術引號的設定進行跳脫的。
...情況更糟...

我花了超過 2 天的時間測試才找出確切的行為,並建立了兩個函式(每個 PHP 版本一個)來可靠地從提交到腳本的任何陣列中移除斜線。希望這可以節省一些人的時間和精力。

以下內容適用於 $_GET 和 $_POST 陣列。我希望受魔術引號影響的其他陣列的行為也相同。
我沒有測試 magic_quotes_sybase 設定的情況下的行為。

== 可能的案例組合圖例 ==
Px = 我們正在使用的 PHP 版本
P4 = php 4.3.9
P5 = PHP 5.0.2

MQ = Magic Quotes GPC
+MQ = 魔術引號已啟用
-MQ = 魔術引號已停用

TL = 頂層鍵值 (TopLevel Key)
+TL = 鍵值位於頂層 (例如:$_GET['myKey'])
-TL = 鍵值嵌套在另一個陣列中 (例如:$_GET['myList']['myKey'])

AK = 陣列鍵值 (Array Key)
+AK = 鍵值的值是另一個陣列 (例如:is_array($_GET['myKey']) == true)
-AK = 鍵值的值是一個普通的字串 (例如:is_string($_GET['myKey']) == true)

== 可能結果的圖例 ==
KE = 鍵值跳脫 (Key Escaping)
+KE = 控制字元前面會加上反斜線
-KE = 鍵值會以提交的樣子返回,不需要去除跳脫字元

VE = 值跳脫 (Value Escaping) (不適用於值為陣列的情況)
+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 版本下執行,且魔術引號停用的情況下,頂層包含字串的 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` 的情況測試這些組合 — 請讓我知道結果。
很抱歉這麼一大段文字,但它很完整。我無法再更精簡這個決策表了。
louis at greynoise dot co dot uk
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()` 是否開啟,如果開啟,則會移除字串變數中的跳脫斜線以便輸出。這在開發伺服器和正式伺服器的設定不同的情況下很有用。
heiko dot richler at informatik dot fh-nuernberg dot de
16 年前
@ dot dot dot dot dot alexander at gmail dot com

我建議用 `stripslashes_deep` 取代 `foreach`。

範例 #2 在陣列上使用 `stripslashes()`
<https://php.dev.org.tw/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);
}
?>
venimus at gmail dot com
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']).'" />

這樣您就可以安全地儲存和使用原始(未跳脫)的數據。
dot dot dot dot dot alexander at gmail dot com
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);
}
?>
w3dk
9 年前
> 「如果 magic_quotes_sybase 指令設定為 ON,它將完全覆蓋 magic_quotes_gpc 的設定。」

這段「注意事項」有點誤導。magic_quotes_sybase 只會在 magic_quotes_gpc 已經啟用的情況下,覆蓋用於 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_gpc(或 magic_quotes_runtime)是否啟用,magic_quotes_sybase 都會影響 addslashes() 和 stripslashes() 分別使用的跳脫(和取消跳脫)方法。
To Top