2008-08-09 58 views
10

我已經繼承了一些遺留的PHP代碼當使用register_globals(從PHP 4.2.0開始,此指令默認爲關閉,2002年4月22日發佈)的標準做法時被寫回的內容。使代碼工作register_globals關閉

我們現在知道啓用它對安全性不利。問題是如何在需要使用$_GET$_POST的代碼中找到所有的地方?我唯一的想法是設置錯誤報告來警告未初始化的變量,然後測試網站的每個部分。有更容易的方法嗎?我需要測試站點中的每個代碼路徑還是PHP會根據文件提供警告?

回答

5

如果您將錯誤報告設置爲E_ALL,它將在錯誤日誌中報告有關未定義變量的完整文件名和行號(假設您正在記錄到文件中)。但是,它只會在遇到未定義的變量時發出警告,所以我認爲您必須測試每個代碼路徑。從命令行運行PHP似乎也沒有幫助。

有一個名爲xdebug的調試工具,沒有嘗試過,但也許這可能是有用的?

0

我知道,有設置該腳本的php.ini值具有一定的命令,我這樣去尋找一種方式,發現這太 - Goto last post on page

我還發現了下面的帖子可能是有用的 - Goto last post on the page

如果沒有人找到答案,我會增加更多,但我現在必須趕上火車。

3

我寫了一個script使用內置的Tokenizer函數。它非常粗糙,但它爲我正在處理的代碼庫工作。我相信你也可以使用CodeSniffer

2

您可以手動'僞造'註冊全局效果,但會增加一些安全性。 (我抓住部分這從自從叉叫XOOPS)

// Detect bad global variables 
$bad_global_list = array('GLOBALS', '_SESSION', 'HTTP_SESSION_VARS', '_GET', 'HTTP_GET_VARS', '_POST', 'HTTP_POST_VARS', '_COOKIE', 'HTTP_COOKIE_VARS', '_REQUEST', '_SERVER', 'HTTP_SERVER_VARS', '_ENV', 'HTTP_ENV_VARS', '_FILES', 'HTTP_POST_FILES'); 
foreach ($bad_global_list as $bad_global) { 
    if (isset($_REQUEST[$bad_global])) { 
     die('Bad Global'); 
    } 
} 

// Make global variables 
foreach ($_REQUEST as $name -> $value) { 
    $$name = $value; // Creates a varable nammed $name equal to $value. 
} 

雖然你會想調整它使你的代碼更安全,至少加入您的全局配置變量(如道路和基礎URL)到不好的全局列表。

您也可以使用它來輕鬆編譯所有使用的get/post變量的列表,以幫助您最終用$ _REQUEST ['return_url];替換所有出現的$ return_url。