眾所周知,當php.ini裡面的register_globals=on時,各種變數都被注入代碼,例如來自 HTML 表單的請求變數。再加上 PHP 在使用變數之前是無需進行初始化的。那麼就有可能導致不安全,假如有人惡意發出這麼一個get請求"http://yourdomain/unsafe.php?GLOBALS=",那麼就會清除$GLOBALS變數的值而導致不安全。所以我們可以這樣子寫
[php]
if ((isset($_REQUEST['GLOBALS'])
OR isset($_FILES['GLOBALS']))
AND ini_get('register_globals')) {
die(globals overwrite attempted.');
}
[/php]
========================
register_globals是php.ini裡的一個配置,這個配置影響到php如何接收傳遞過來的參數,如果你的問題是:為什麼我的表單無法傳遞資料?為什麼我的程式無法得到傳遞過來的變數?等等,那麼你需要仔細的閱讀以下的內容。
register_globals的值可以設定為:On或者Off,我們舉一段代碼來分別描述它們的不同。
代碼: |
<form name="frmTest" id="frmTest" action="URL"> <input type="text" name="user_name" id="user_name"> <input type="password" name="user_pass" id="user_pass"> <input type="submit" value="login"> </form> |
當register_globals=Off的時候,下一個程式接收的時候應該用$_GET['user_name']和$_GET['user_pass']來接受傳遞過來的值。(註:當<form>的method屬性為post的時候應該用$_POST['user_name']和$_POST['user_pass'])
當register_globals=On的時候,下一個程式可以直接使用$user_name和$user_pass來接受值。
顧名思義,register_globals的意思就是註冊為全域變數,所以當On的時候,傳遞過來的值會被直接的註冊為全域變數直接使用,而Off的時候,我們需要到特定的數組裡去得到它。所以,碰到上邊那些無法得到值的問題的朋友應該首先檢查一下你的register_globals的設定和你擷取值的方法是否匹配。(查看可以用phpinfo()函數或者直接查看php.ini)
那我們為什麼要使用Off呢?原因有2:
1、php以後的新版本預設都用Off,雖然你可以設定它為On,但是當你無法控制伺服器的時候,你的代碼的相容性就成為一個大問題,所以,你最好從現在就開始用Off的風格開始編程
2、這裡有兩篇文章介紹為什麼要Off而不用On
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=php3&Number=292803&page=0&view=collapsed&sb=5&o=all&fpart=
http://www.php.net/manual/en/security.registerglobals.php
現在還有一個問題就是,以前用On風格寫的大量指令碼怎麼辦?
如果你以前的指令碼規劃得好,有個公用包含檔案,比如config.inc.php一類的檔案,在這個檔案裡加上以下的代碼來類比一下(這個代碼不保證100%可以解決你的問題,因為我沒有大量測試,但是我覺得效果不錯)。另外,這個文章裡的解決方案也可以參考一下(http://www.chinaunix.net/forum/viewtopic.php?t=159284)。
代碼: |
<?php if ( !ini_get('register_globals') ) { extract($_POST); extract($_GET); extract($_SERVER); extract($_FILES); extract($_ENV); extract($_COOKIE); if ( isset($_SESSION) ) { extract($_SESSION); } } ?> |
register_globals = Off的情況不僅僅影響到如何擷取從<form>、url傳遞過來的資料,也影響到session、cookie,對應的,得到session、cookie的方式應該為:$_SESSION[]、$_COOKIE。同時對於session的處理也有一些改變,比如,session_register()沒有必要而且失效,具體的變化,請查看php manual裡的Session handling functions
$_REQUEST中間的內容實際上還是來源於$_GET $_POST $_COOKIE,缺點是無法判斷變數到底來自於get post 還是cookie,對要求比較嚴格的場合不適用。