Using Register Globals

(2014-12-09 Update: use gist instead of inline code block)


之前雖然常聽到 register_globals 的安全議題, 不過始終沒有正視它
最近總算碰到麻煩了, 索性一口氣把英文 manual 上相關的部份翻譯成中文, 就當作是做個筆記吧

從 PHP 4.2.0 開始,register_globals 這個系統變數的預設值從 ON 變為 OFF。
許多人不知道他的存在,卻常常使用到他,而以為PHP本來就是這樣子運作。這兒將會解釋不安全的程式碼可能引發的危機。
當 register_globals 設成 ON,他將會把所有可能的變數代換到你的程式碼當中,包括 HTML 表單丟進來的變數。因為 PHP 不需要替變數做初始化,因此我們很容易就寫出帶有潛在
問題的程式碼。因此 PHP 開發團隊決定將 OFF 作為預設值。當開啟時,人們不知道他所使用的變數從何而來,內定變數將與外部傳進來的變數搞混,將
register_globals 設成OFF即可避免這個問題。以下是幾個誤用 register_globals 的範例:

當 register_globals = on,上述判斷式可能會有邏輯問題。 當它設成 off,$authorized 就不能經由傳遞變數來設值,所以我們應該養成替變數初始化的好習慣所以我們應該養成替變數初始化的好習慣。
在本例中,我們可以先設 $authorized = false。它可以在 register_globals = on 或 off 的情況下防堵未經授權的使用者。

以下是一個關於 sessions 的例子。當 register_globals = on,我們可以設定 $username 經由其他的方式像是透過 URL傳遞。

當可能是入侵的行為發生時,我們可以採取防護措施。如果你已經知道送進來的資料確切的來源,就可以檢查那些經由非正規管道傳遞的資料。雖然這並不能保證資料不被篡改,但它可以讓攻擊者花上好一段時間。 如果不在意資料的來源,可以用 $_REQUEST 來承接 GET, POST and COOKIE 這些資料的大雜燴。詳細資料可以參考 PHP Manual 當中 “on using variables from outside of PHP” 這一章節。

當然,僅僅關閉register_globals這個變數並不代表你的程式碼一定是安全的,對於每一個變數我們都應該善加檢查:不要忘記永遠確認你的資料以及初始化變數。 打開 error_reporting() 可以檢查未經初始化的變數。

Superglobals: availability note: Since PHP 4.1.0, superglobal arrays such as $_GET , $_POST, and $_SERVER, etc. have been available. For more information, read the manual section on superglobals

在〈Using Register Globals〉中有 2 則留言

  1. 其實這一篇已經醞釀了近一個月,
    到了今天才真正release,
    看了一下感覺還不錯 😛

    希望能繼續朝著”信、達、雅”的目標進步~

  2. 雖然不是很懂….但我知道原本那樣有一定的危險性存在
    I try it!!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *