好吧,我不記得這個細節,但某些服務器上就可以使用,而不是
是$ var$ _GET [「變種」]訪問URL中的變量,我知道這是不好的,但我不記得爲什麼它不好?
好吧,我不記得這個細節,但某些服務器上就可以使用,而不是
是$ var$ _GET [「變種」]訪問URL中的變量,我知道這是不好的,但我不記得爲什麼它不好?
我想你的意思是Register Globals。
您不應該使用它們,因爲您無法區分變量值的來源,因爲它們可能來自任何EGPCS變量源(環境,GET,POST,Cookie,服務器)。
所以,如果你有一個在$var
,你不能,如果值是從說$_ENV['var']
,$_GET['var']
,$_POST['var']
,$_COOKIE['var']
或$_SERVER['var']
。
如果您的服務器的register_globals
在php.ini文件中設置爲1(或true),那麼可以使用它。
在某些情況下,默認情況下它已關閉,應用程序開始中斷,這就是爲什麼這是不好的做法。您可以看到php.ini
變量列表here。
該功能被稱爲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";
}
?>
這不是原因。雖然使用未定義的變量也不是一個好的風格。但是,如果您使用'$ authorized = false;'來設置默認值,那麼您不會遇到這個問題。 – Gumbo 2009-09-21 22:15:51
@Gumbo:PHP文檔將其列在其原因列表的頂部。 – RichieHindle 2009-09-21 22:20:26
@Gumbo儘管這確實是重點 - 但你必須記住設置默認值,對於所有敏感的事情來說都是如此。如果沒有register_globals,風險會降低很多 - 忘記將其設置爲false並不能實現利用。 – ceejayoz 2009-09-21 22:41:01
這也很糟糕,因爲您可能會以PHP將範圍變量的方式混淆自己。如果你不小心,你可能會覆蓋數據。而且,使用$ _GET對於你正試圖完成的任務來說更加清晰。
設置被稱爲REGISTER_GLOBALS
並在這裏討論:
(如果您不知道/記住設置的名稱,則無法找到它) – 2009-09-21 22:14:15
如果你能做到這一點,那麼「register_globals的」已開啓。這很糟糕,因爲你不知道變量來自哪裏,它將變量與任何用戶可以通過URL注入的變量混合在一起。在這裏閱讀更多:http://www.php.net/manual/en/security.globals.php
這很糟糕,因爲如果你在使用它之前不仔細地初始化每個變量(PHP不會強迫你這麼做),人們可以很容易地讓你的代碼做很壞的事情請求簡單到/myapp/index.php?admin_privileges=1
。
一旦你習慣了使用$ _POST,$ _GET等,你的代碼的目的將更容易閱讀,而且更容易維護。
註冊全局變量可以工作,但在未來版本的PHP中會變爲going to go away。更不用說它啓用它真的是錯誤的。
您可以使用extract()進行更受控制的行爲。它會將數組中的鍵(在本例中爲$ _GET)作爲變量提取到本地上下文中。你可以給它們一個通用的前綴,以免它們與你現有的變量相沖突。你可以預先過濾數組,以確保你只獲得預期的變量。從陣列到當前符號表
int extract($var_array [, $type = EXTR_OVERWRITE [, $prefix ]])
導入變量。
「因爲讓它休息應用程序」不是一個很好的理由。變量注入並且不能區分請求/環境變量的類型是兩個主要的變量。 – jnylen 2009-09-21 23:28:37