2009-09-21 77 views
3

好吧,我不記得這個細節,但某些服務器上就可以使用,而不是

是$ var$ _GET [「變種」]訪問URL中的變量,我知道這是不好的,但我不記得爲什麼它不好?

回答

8

我想你的意思是Register Globals

您不應該使用它們,因爲您無法區分變量值的來源,因爲它們可能來自任何EGPCS變量源(環境,GET,POST,Cookie,服務器)。

所以,如果你有一個在$var,你不能,如果值是從說$_ENV['var']$_GET['var']$_POST['var']$_COOKIE['var']$_SERVER['var']

2

如果您的服務器的register_globals在php.ini文件中設置爲1(或true),那麼可以使用它。

在某些情況下,默認情況下它已關閉,應用程序開始中斷,這就是爲什麼這是不好的做法。您可以看到php.ini變量列表here

+1

「因爲讓它休息應用程序」不是一個很好的理由。變量注入並且不能區分請求/環境變量的類型是兩個主要的變量。 – jnylen 2009-09-21 23:28:37

7

該功能被稱爲Register Globals,它允許人們向代碼中注入變量。例子見the documentation;這裏是一個:

<?php 
// define $authorized = true only if user is authenticated 
if (authenticated_user()) { 
    $authorized = true; 
} 

// Because we didn't first initialize $authorized as false, this might be 
// defined through register_globals, like from GET auth.php?authorized=1 
// So, anyone can be seen as authenticated! 
if ($authorized) { 
    include "/highly/sensitive/data.php"; 
} 
?> 
+0

這不是原因。雖然使用未定義的變量也不是一個好的風格。但是,如果您使用'$ authorized = false;'來設置默認值,那麼您不會遇到這個問題。 – Gumbo 2009-09-21 22:15:51

+0

@Gumbo:PHP文檔將其列在其原因列表的頂部。 – RichieHindle 2009-09-21 22:20:26

+3

@Gumbo儘管這確實是重點 - 但你必須記住設置默認值,對於所有敏感的事情來說都是如此。如果沒有register_globals,風險會降低很多 - 忘記將其設置爲false並不能實現利用。 – ceejayoz 2009-09-21 22:41:01

1

這也很糟糕,因爲您可能會以PHP將範圍變量的方式混淆自己。如果你不小心,你可能會覆蓋數據。而且,使用$ _GET對於你正試圖完成的任務來說更加清晰。

1

因爲讓人們將值注入任意變量是非常糟糕的事情。你可能在那裏存儲任何東西,並且可能會覆蓋一些危害你安全性的值。請記住在嘗試使用之前使用isset檢查是否已設置了一個值。

+1

isset()將無濟於事 - 如果register_globals處於打開狀態並且客戶端執行了類似於page.php?var = 1的操作 - 那麼isset($ var)仍然會返回true。 – jnylen 2009-09-21 23:30:00

+0

對不起,我的意思是在使用$ _GET之前。我認爲OP不會使用註冊全局變量。 – Joe 2009-09-22 07:05:19

0

設置被稱爲REGISTER_GLOBALS並在這裏討論:

Why is REGISTER_GLOBALS so bad?

+0

(如果您不知道/記住設置的名稱,則無法找到它) – 2009-09-21 22:14:15

0

如果你能做到這一點,那麼「register_globals的」已開啓。這很糟糕,因爲你不知道變量來自哪裏,它將變量與任何用戶可以通過URL注入的變量混合在一起。在這裏閱讀更多:http://www.php.net/manual/en/security.globals.php

1

這很糟糕,因爲如果你在使用它之前不仔細地初始化每個變量(PHP不會強迫你這麼做),人們可以很容易地讓你的代碼做很壞的事情請求簡單到/myapp/index.php?admin_privileges=1

0

一旦你習慣了使用$ _POST,$ _GET等,你的代碼的目的將更容易閱讀,而且更容易維護。

0

註冊全局變量可以工作,但在未來版本的PHP中會變爲going to go away。更不用說它啓用它真的是錯誤的。

您可以使用extract()進行更受控制的行爲。它會將數組中的鍵(在本例中爲$ _GET)作爲變量提取到本地上下文中。你可以給它們一個通用的前綴,以免它們與你現有的變量相沖突。你可以預先過濾數組,以確保你只獲得預期的變量。從陣列到當前符號表

int extract($var_array [, $type = EXTR_OVERWRITE [, $prefix ]]) 

導入變量。