首頁 >php教程 >php手册 >php 安全register globals设置为TRUE的危害

php 安全register globals设置为TRUE的危害

WBOY
WBOY原創
2016-06-13 09:52:391111瀏覽



问题
关于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]);

}

}


复制代码就说到这里了!

[ ]


参考答案
好,就喜欢这类细究的文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn