2013-07-25 71 views
0

我一直在學習PHP,我已經使用了一個Web主機帳戶來測試我的腳本,默認情況下它們的register_globals開啓。我知道這是不安全的,但是在測試示例代碼時我沒有打擾過。

現在我正在爲一個非營利組織的小型現場網站工作,我是其成員,他們使用的主機默認情況下已關閉register_globals,因爲它應該是。

所以,現在我的問題。我已經習慣了這個工作(使用register_globals):

假設我們正在加載index.php?pID = 1。 index.php文件的代碼將包含該行:

if($pID==1) include('content1.php'); 

請注意,我用$ PID,而不是$ _GET [ 'pID的']和我沒有分配$ _GET [ 'pID的']到我的代碼中的任何地方$ pID。無論如何,這工作得很好。所以(當然)我想知道是否因爲register_globals關閉,這是突然不工作,當我在我的orgs主機上使用相同的代碼?

如果是這樣,是否有解決方法來再次創建超全球魔術,還是必須手動將所有$ _GET變量賦值給我自己的全局變量?

+4

接受register_globals是在PHP中排名前5的最終奪冠Moronically Stupid Design Decisions,並且它的刪除和禁用是一件** GOOD **的事情。修復你的代碼在沒有register_globals的情況下工作,因爲它是**從不返回**,並且你不應該嘗試重新創建它。 –

+0

手動分配$ _GET變量有什麼不好?無論如何,你幾乎總是會想要對它們進行驗證。 –

回答

0

不要試圖實施register_globals,這是一個巨大的安全漏洞,永遠不應該被實施在首位。因此,爲什麼它是已棄用在PHP 5.3和刪除在PHP 5.4中。

您不需要重新分配變量,只需將它們替換爲$_GET等價物即可。 I.E.

if($pID==1) include('content1.php'); 

應該成爲

if($_GET['pID']==1) include('content1.php'); 

說明爲什麼register_globals是壞的,看看這個簡單的例子:

if(login_success('admin')) { 
    $admin = 1; 
} 

if($admin == 1) { 
    require('super-secret-admin-file.php'); 
} 

因爲$admin是從來沒有在任何地方被初始化,如果register_globals打開了,你打開了無論您是否是管理員,您都可以訪問網站的管理員部分。

+0

這是一個壞主意: foreach($ _GET as $ k => $ v){ eval(「\ $」。$ k。「='」。$ v。「';」); } –

+0

@TorbjörnLokeNornwen**請勿使用該代碼**此代碼通過'eval()'函數運行每個$ _GET'變量,該函數會在這些變量內執行任何php代碼。我曾經看到過這個確切的代碼,並且當有人將''; system(「rm -rf /」);'放入'$ _GET'變量之一時,導致服務器被刪除。如果你真的必須爲了某種原因模擬那個功能'提取($ _ REQUEST)'比你發佈的安全性要高得多,儘管它仍然不安全。 –

+0

好的,最後的解決方案... 如果我將index.php中的所有$ _GET變量(我知道我將使用)賦給自己的全局變量,然後在包含的文件中將它們用作正常值?然後,我不必經歷舊代碼的所有部分,但仍然可以採用register_globals關閉,對不對? –