关于PHP的register_globals的问题

register_globals容易引起PHP的安全性问题,例如下面的例子是用来检验用户是否已经登录,如果登录后就显示数据的php:

<?php
// 检查用户是否登录,如果登录就把$authorized设置为true
if (authenticated_user()) {
    $authorized = true;
}

// 但是因为我们没有在开始的时候设置$authorized为false,
//恶意用户可以通过访问auth.php?authorized=1达到通过验证的效果
// 这样的话,每个人都能看到数据了
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

在PHP 4.2.0以后的版本中,register_globals是默认被设置为OFF的,如果有老的代码需要使用register_globals,可以在index中做如下处理:

<?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);
    }
}
?>

参考:
http://www.php.net/manual/en/security.globals.php
http://www.php.net/manual/en/faq.misc.php#faq.misc.registerglobals

Leave a Reply

Your email address will not be published. Required fields are marked *