2010-11-11 86 views
3

我正在研究幾年前構建的應用程序,它最近停止正常工作。老程序員說,他可能會訪問$_GET$_POST變量,但不從$_GET[] array閱讀它們,而是通過register_globals

我想問:(?如直接的方法)什麼是訪問$_GET變量,而無需使用$_GET[]陣列不同的方式如果知道,我該如何檢查這個應用程序是否使用其中的任何一個?

預先感謝您

編輯:我記得在很多其他方面都register_globals,不magic_quotes。另外,我不希望使用它,而如果使用,並在最新的服務器更新棄用它檢測(什麼可以解釋爲什麼應用程序停止正常工作)

編輯:我的英語今天是可怕的。正如我在回答一個解釋:我需要檢查,原來的程序是否使用正從查詢字符串變量到PHP的一些模糊的和/或方法已過時,因此它們的值應用現在都錯/未初始化工作

重要編輯import_request_variables不在表中,因此未使用。所有$_數組也不在場,因爲最新的更新不會破壞它們(=>它們仍然有效)。如何檢測用register_globals初始化哪些變量?

又一編輯:我發現這一點:(最多1個星期前)

foreach ($_POST as $k => $v) { 
    eval("\$".$k." = '".$v."';"); 
} 
foreach ($_GET as $k => $v) { 
    eval("\$".$k." = '".$v."';"); 
} 

莫非已經通過最新更新一個破?

+4

我們有關係嗎? – 2010-11-11 14:11:40

+0

它會給出某種錯誤嗎?如果沒有,那麼它不起作用。在我們診斷問題之前,我們需要知道。 – 2010-11-11 14:12:27

+0

我也會認爲他寧願用'register_globals'或PHP3數組''HTTP_GET_VARS'來代替。無論哪種方式都不好。努力重寫這些東西。 – mario 2010-11-11 14:13:35

回答

4

您的意思是通過Register Globals而不是Magic Quotes ...順便說一句註冊Globals是純粹的邪惡從來沒有使用它們(並且它們從PHP 5.3.0開始已棄用)!

編輯:如果您想檢查應用程序是否使用了Register Globals,請嘗試搜索$_GET值作爲變量。例如對於index.php?id=123,請嘗試在PHP代碼中查找$id。如果您發現這並不意味着腳本使用了註冊全局變量,但是如果$id來自無處,並且從未初始化/設置它是一個很好的(壞的)符號,該應用程序使用註冊全局變量...

+0

我仍然不確定用例是什麼...... – cwallenpoole 2010-11-11 14:13:27

+0

@Christopher W. Allen-Poole註冊Globals對於任何真正的程序員來說都是毫無用處的。他們是PHP歷史上最大的WTF。我猜他們是爲了幫助非程序員構建帶有安全漏洞的應用程序;) – AlexV 2010-11-11 14:16:21

+0

嗯,我不使用它們,也從來沒有 - 我記得幾年前我在某些PHP書中讀到的第一件事 - **不使用'register_globals' **,所以我從不關心它。也許我應該有。 – 2010-11-11 14:19:07

2

您也有$_REQUEST,magic_quotes(不建議使用)只會影響變量的內容,而不會影響變量的內容。

另請參閱import_request_variables,原始編碼器可能用它來獲取GET變量的內容並將其插入到隨後被引用的另一個變量中。

2

$_SERVER["QUERY_STRING"]會給你原始的GET字符串。

這就是說,這聽起來像一個問題,應該固定在它的根,而不是使用一個不同的變量。

如果魔法引號是個問題,請檢查它們是否已啓用,並相應地處理傳入的數據。

PHP手冊中的頁面顯示了一種根據功能是否激活來「修復」傳入數據的方法。對於大量數據來說效率不高,但應該在日常任務中完成。

+0

這個問題是糟糕的措辭(我今天真的很累^ _ ^) - 我需要檢查,原始程序員是否使用了一些模糊的和/或不贊成使用的方法從查詢字符串中獲取變量到PHP。 – 2010-11-11 14:16:15

+0

@Adam現在register_globals在桌面上,我的答案可能不適用。沒關係。儘管如此,修復根本原因的基本建議仍然有效:)雖然這可能需要很多工作。 – 2010-11-11 14:17:16

1

問題是大概是PHP's register_globals。此選項會自動將$_GET['some_var']或其等效$_POST版本作爲$some_var提供。這是棄用的,你絕對不應該使用它,但其他程序員可能已經在該應用程序中使用它們。

1

註冊Globals是一個可怕的功能,老的PHP程序通常依賴。

隨着註冊全局變量開啓,PHP將查看GET和POST變量並將它們「提升」爲正常的變量名 - 例如$_GET['myvar']將可在代碼中作爲$myvar訪問。

在其他問題中,這使得程序非常容易被黑客破解,只需猜測程序員可能使用了哪些其他變量名稱。因此,註冊全局變量功能已被默認關閉很長一段時間,現在已正式棄用,並將在未來版本中完全刪除。

因爲用這種方式使用的變量是以與普通變量無法區分的方式引用的,這意味着嘗試更新使用註冊全局變量的舊代碼可能非常困難。它的確取決於編寫代碼的程度。