PHP安全之register_globals的on和off的區(qū)別
一、register_globals=Off和register_globals=On的區(qū)別
register_globals是php.ini里的一個(gè)配置,這個(gè)配置影響到php如何接收傳遞過來的參數(shù).
register_globals的值可以設(shè)置為:On或者Off,我們舉一段代碼來分別描述它們的不同。
<form action='' method='get'> <input type='text' name='username' value='alex' > <input type='submit' name='sub' value='sub'> </form> <?php echo 'username::',$username; echo '<br>sub::',$sub; echo '<br>GET::'; print_r($_GET); ?>
當(dāng)register_globals=On的時(shí)候,程序運(yùn)行提交輸出結(jié)果為:
username::alex
sub::sub
array ( [username] => alex [sub] => sub )
當(dāng)register_globals=Off的時(shí)候,程序運(yùn)行提交輸出結(jié)果為:
username::
sub::
array ( [username] => alex [sub] => sub )
通過測試結(jié)果,顯而易見:register_globals的意思就是注冊為全局變量,所以當(dāng)On的時(shí)候,傳遞過來的值會(huì)被直接的注冊為全局變量直接使用,而Off的時(shí)候,我們需要到特定的數(shù)組里去得到它。
二、為什么推薦register_globals=Off?
1.PHP4.2.0版開始配置文件中register_globals的默認(rèn)值從on改為off了,雖然你可以設(shè)置它為On,但是當(dāng)你無法控制服務(wù)器的時(shí)候,你的代碼的兼容性就成為一個(gè)大問題,所以,你最好從現(xiàn)在就開始用Off的風(fēng)格開始編程。
2.當(dāng)register_globals打開以后,各種變量都被注入代碼,例如來自HTML表單的請求變量。再加上PHP在使用變量之前是無需進(jìn)行初始化的,這就使得更容易寫出不安全的代碼。當(dāng)打開時(shí),人們使用變量時(shí)確實(shí)不知道變量是哪里來的,只能想當(dāng)然。但是register_globals的關(guān)閉改變了這種代碼內(nèi)部變量和客戶端發(fā)送的變量混雜在一起的糟糕情況。例子來源手冊
<?php // 當(dāng)用戶合法的時(shí)候,賦值 $authorized = true if (authenticated_user()) { $authorized=true; } // 由于并沒有事先把 $authorized 初始化為 false, // 當(dāng) register_globals 打開時(shí),可能通過GET auth.php?authorized=1 來定義該變量值 // 所以任何人都可以繞過身份驗(yàn)證 if ($authorized) { include"/highly/sensitive/data.php"; } ?>
當(dāng) register_globals = on 的時(shí)候,上面的代碼就會(huì)有危險(xiǎn)了。如果是 off,$authorized 就不能通過如 URL 請求等方式來改變,這樣就好多了,盡管初始化變量是一個(gè)良好的編程習(xí)慣。比如說,如果在上面的代碼執(zhí)行之前加入 $authorized = false 的話,無論 register_globals 是 on 還是 off 都可以,因?yàn)橛脩魻顟B(tài)被初始化為未經(jīng)認(rèn)證。
三、如果需要在一臺關(guān)閉了 register_globals 的共享主機(jī)上運(yùn)行一些舊式程序而該程序需要此選項(xiàng)打開時(shí)怎么辦?
本例模擬 register_globals On。如果改變了配置文件中的 variables_order 選項(xiàng),則考慮對 $superglobals 作出相應(yīng)的改動(dòng)。
<?php// Emulate register_globals on if (!ini_get('register_globals')) { $superglobals= array($_SERVER,$_ENV,$_FILES,$_COOKIE,$_POST,$_GET); if (isset($_SESSION)) { array_unshift($superglobals,$_SESSION); } foreach ($superglobals as $superglobal) { extract($superglobal,EXTR_SKIP); } } ?>
四、如果需要在一些打開了register_globals選項(xiàng)的主機(jī)上但想消除安全隱患,該怎么辦?
本例模擬 register_globals Off。要記住此代碼應(yīng)在腳本最開頭的地方調(diào)用。如果使用了會(huì)話機(jī)制,則在 session_start() 之后調(diào)用。
<?php// Emulate register_globals off functionun register_GLOBALS(){ if (!ini_get('register_globals')) { return; } // Might want to change this perhaps to a nicer error if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) { die('GLOBALS overwrite attempt detected'); } // Variables that shouldn't be unset $noUnset= array('GLOBALS','_GET','_POST','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES'); $input=array_merge($_GET,$_POST,$_COOKIE,$_SERVER,$_ENV,$_FILES,isset($_SESSION) &&is_array($_SESSION) ?$_SESSION: array()); foreach ($input as $k=>$v) { if (!in_array($k,$noUnset) && isset($GLOBALS[$k])) { unset($GLOBALS[$k]); } } } unregister_GLOBALS(); ?>
到此這篇關(guān)于PHP安全之register_globals的on和off的區(qū)別的文章就介紹到這了,更多相關(guān)PHP安全 register_globals內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過PHP的內(nèi)置函數(shù),通過DES算法對數(shù)據(jù)加密和解密
數(shù)據(jù)加密的基本過程就是對原來為明文的文件或數(shù)據(jù)按某種算法進(jìn)行處理,使其成為不可讀的一段代碼,通常稱為密文,使其只能在輸入相應(yīng)的密鑰之后才能顯示出本來內(nèi)容,通過這樣的途徑來達(dá)到保護(hù)數(shù)據(jù)不被非法人竊取、閱讀的目的2012-06-06php使用unset()刪除數(shù)組中某個(gè)單元(鍵)的方法
這篇文章主要介紹了php使用unset()刪除數(shù)組中某個(gè)單元(鍵)的方法,實(shí)例分析了unset函數(shù)在刪除數(shù)組單元時(shí)的使用技巧,需要的朋友可以參考下2015-02-02Zend studio for eclipse中使php可以調(diào)用mysql相關(guān)函數(shù)的設(shè)置方法
默認(rèn)情況zend studio 中的php是不支持mysql 相關(guān)操作,但通過下面的方法即可解決2008-10-10php數(shù)組添加與刪除單元的常用函數(shù)實(shí)例分析
這篇文章主要介紹了php數(shù)組添加與刪除單元的常用函數(shù),實(shí)例分析了array_push、array_pop、array_shift及array_unshift等函數(shù)的使用技巧,需要的朋友可以參考下2015-02-02PHP ADODB實(shí)現(xiàn)分頁功能簡單示例
這篇文章主要介紹了PHP ADODB實(shí)現(xiàn)分頁功能,結(jié)合實(shí)例形式分析了php使用ADODB實(shí)現(xiàn)分頁功能相關(guān)操作技巧,需要的朋友可以參考下2018-05-05PHP基于正則批量替換Img中src內(nèi)容實(shí)現(xiàn)獲取縮略圖的功能示例
這篇文章主要介紹了PHP基于正則批量替換Img中src內(nèi)容實(shí)現(xiàn)獲取縮略圖的功能,涉及php針對頁面img元素的正則匹配與替換操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06