溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP安全之register_globals的on和off有哪些區(qū)別

發(fā)布時間:2021-02-01 10:45:24 來源:億速云 閱讀:122 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹PHP安全之register_globals的on和off有哪些區(qū)別,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

一、register_globals=Off和register_globals=On的區(qū)別

register_globals是php.ini里的一個配置,這個配置影響到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的時候,程序運(yùn)行提交輸出結(jié)果為:

    username::alex 
    sub::sub  
    array ( [username] => alex [sub] => sub )  

當(dāng)register_globals=Off的時候,程序運(yùn)行提交輸出結(jié)果為:

  username::  
    sub::  
    array ( [username] => alex [sub] => sub )  

通過測試結(jié)果,顯而易見:register_globals的意思就是注冊為全局變量,所以當(dāng)On的時候,傳遞過來的值會被直接的注冊為全局變量直接使用,而Off的時候,我們需要到特定的數(shù)組里去得到它。

二、為什么推薦register_globals=Off?

1.PHP4.2.0版開始配置文件中register_globals的默認(rèn)值從on改為off了,雖然你可以設(shè)置它為On,但是當(dāng)你無法控制服務(wù)器的時候,你的代碼的兼容性就成為一個大問題,所以,你最好從現(xiàn)在就開始用Off的風(fēng)格開始編程。

2.當(dāng)register_globals打開以后,各種變量都被注入代碼,例如來自HTML表單的請求變量。再加上PHP在使用變量之前是無需進(jìn)行初始化的,這就使得更容易寫出不安全的代碼。當(dāng)打開時,人們使用變量時確實(shí)不知道變量是哪里來的,只能想當(dāng)然。但是register_globals的關(guān)閉改變了這種代碼內(nèi)部變量和客戶端發(fā)送的變量混雜在一起的糟糕情況。例子來源手冊

<?php 
 
 // 當(dāng)用戶合法的時候,賦值 
 
 $authorized = true 
  
 if (authenticated_user()) { 
 
 $authorized=true; 
 
 } 
  
 // 由于并沒有事先把 $authorized 初始化為 false, 
 
 // 當(dāng) register_globals 打開時,可能通過GET auth.php?authorized=1 來定義該變量值 
 
 // 所以任何人都可以繞過身份驗(yàn)證 
 
 if ($authorized) { 
 
 include"/highly/sensitive/data.php"; 
 
 } 
 
 ?>

當(dāng) register_globals = on 的時候,上面的代碼就會有危險了。如果是 off,$authorized 就不能通過如 URL 請求等方式來改變,這樣就好多了,盡管初始化變量是一個良好的編程習(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)打開時怎么辦?

本例模擬 register_globals On。如果改變了配置文件中的 variables_order 選項(xiàng),則考慮對 $superglobals 作出相應(yī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)用。如果使用了會話機(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(); 
 
 ?>

以上是“PHP安全之register_globals的on和off有哪些區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)
推薦閱讀:
  1. PHP安全配置
  2. Php安全

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI