Register Globals 不安全的原因
基本上從Linux下Apache與PHP安全相關設置,可以得知一個安全的 php.ini設置如下.
php.ini的安全設置範例:
——————————————————————————–
safe_mode = On
allow_url_fopen = Off
allow_url_include = Off
register_globals = Offmagic_quotes_gpc = On
display_errors = Off
disable_functions = shell_exec,system,exec,passthru,show_source,get_cfg_var
#或者,也可以考慮開放後兩個危險係數較低的函數:
disable_functions = shell_exec,system,exec,passthru
open_basedir = .
而其中對於大家最熟悉的莫過於register_globals這個變數,有許多網站他要設置為on才能運作,例如OSC購物車,我對於這邊其實不太了解,之後在網路上搜尋找到了以下的見解 ﹔
很多 PHP 初學者也會遇到 Register Globals 的問題,而程式是基於開啟 Register Globals 的 PHP 開發的話,會有安全性的問題,所以不建議開啟,至於有問題的原因,先看以下程式碼:
CODE:
-
-
if($username == "admin" && $password == "passwd"){
-
$valid = true;
-
}
-
-
if($valid){
-
// print something to valid user
-
}
-
?>
以上程式碼是先檢查用戶名稱及密碼,如果正確就定義 $valid 變數為 true,但如果有人在網址列的最後加上 ?valid=1,那麼即使沒有輸入密碼也可以通過。
而關閉了 register_globals 的話,所有用戶輸入的變數也會用 $_POST, $_GET 及 $COOKIE 等陣列,所以如果在網址列加入 ?valid=1 的話,所傳入的變數只是 $_GET['valid'],而不是 $valid。
當然以上例子的問題可以在最開始的部份加一行 @unset($valid) 解決,但只要關閉 register_globals 就可以完全解決問題。PHP 的官方網站還有一篇關於 register_globals 的安全文章,裡面有更詳細的介紹
原出處:www.real-blog.com/programming/239