php – 解決register_globals在PHP 5.4之後移除的方案

register_globals

在 PHP 5.3.0 起廢棄並在PHP 5.4.0 起移除。
這功能這樣子運作的:
當你有一筆$_POST[a] = 123;
嚴謹的寫法應該是
$a = $_POST[a];
echo $a; //輸出123

但如果php.ini中register_globals = On
你只需要
echo $a; // 輸出123

方便,但是很不安全。不安全請參考官網說明。

但當遇到專案非常龐大,有時候改版須要一個一個檢查又沒有時間,
你需要使用原來的register_globals功能來應急一下,

PHP下面的版有網友寫出一個function可供網友貼到你的全域文件。
這樣在php 5.4 以後就可以照常運作了(等同register_globals = On)。
轉自http://tw1.php.net/manual/en/security.globals.php



/**
 * function to emulate the register_globals setting in PHP
 * for all of those diehard fans of possibly harmful PHP settings :-)
 * @author Ruquay K Calloway
 * @param string $order order in which to register the globals, e.g. 'egpcs' for default
 */
function register_globals($order = 'egpcs')
{
    // define a subroutine
    if(!function_exists('register_global_array'))
    {
        function register_global_array(array $superglobal)
        {
            foreach($superglobal as $varname => $value)
            {
                global $$varname;
                $$varname = $value;
            }
        }
    }

    $order = explode("rn", trim(chunk_split($order, 1)));
    foreach($order as $k)
    {
        switch(strtolower($k))
        {
            case 'e':    register_global_array($_ENV);        break;
            case 'g':    register_global_array($_GET);        break;
            case 'p':    register_global_array($_POST);        break;
            case 'c':    register_global_array($_COOKIE);    break;
            case 's':    register_global_array($_SERVER);    break;
        }
    }
}
register_globals();



發表迴響