程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 安全register globals設置為TRUE的危害

php 安全register globals設置為TRUE的危害

編輯:關於PHP編程



問題
關於register globals設置為TRUE的危害
解決方法
關於register globals設置為TRUE的危害
應該很多人看過把register globals設置為on是非常危險的,但是怎麼危險法呢??應該很多新手不知道的!所以我就簡單說說register globals設置為on的危害吧!
先看看下面的代碼:
在config.php文件中有一下的代碼:

$GLOBALS[‘host’] = 'localhost';

$GLOBALS[‘username’] = 'root';

$GLOBALS[‘password’] = '';

$GLOBALS[‘database’] = 'test';

?>


復制代碼在db.php中有以下代碼:

require_once 'config.php';

function db_connect() {

$db=mysql_connect($GLOBALS['host'], $GLOBALS['username'], $GLOBALS['password']);

mysql_select_db($GLOBALS['database'], $db);

return $db;

}

?>


復制代碼很明顯加入上面的代碼是在register globals設置為on的時候的話,看看有什麼效果:
在浏覽器中輸入:http://********/index.php?GLOBALS=***那你上面的代碼就執行錯誤了!因為$GLOBALS的數據已經修改了!當register globals設置為on的時候,?GLOBALS=***這樣的形式會轉換成$GLOBALS = ***的形式的!!所以非常危險。
雖然在這個例子中危害不大,但是在一些需要用到$GLOBALS全局變量的地方我們都應該檢測register globals是否設置為on,可以用以下代碼來檢測一下(代碼來源於wordpress): function wp_unregister_GLOBALS() {

if ( !ini_get('register_globals') )

return;



if ( isset($_REQUEST['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]) ) {

$GLOBALS[$k] = NULL;

unset($GLOBALS[$k]);

}

}


復制代碼就說到這裡了!

[ ]


參考答案
好,就喜歡這類細究的文章!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved