首頁 >後端開發 >php教程 >php框架 - php的ci框架中的一段程式碼自己理解起來比較困難,望大神指教。

php框架 - php的ci框架中的一段程式碼自己理解起來比較困難,望大神指教。

WBOY
WBOY原創
2016-08-20 09:04:09925瀏覽

<code>/*
 * ------------------------------------------------------
 * Security procedures
 * ------------------------------------------------------
 */

if ( ! is_php('5.4')) // 如果php版本大于等于5.4
{
    ini_set('magic_quotes_runtime', 0);

    if ((bool) ini_get('register_globals'))
    {
        $_protected = array(
            '_SERVER',
            '_GET',
            '_POST',
            '_FILES',
            '_REQUEST',
            '_SESSION',
            '_ENV',
            '_COOKIE',
            'GLOBALS',
            'HTTP_RAW_POST_DATA',
            'system_path',
            'application_folder',
            'view_folder',
            '_protected',
            '_registered'
        );

        $_registered = ini_get('variables_order');
        foreach (array('E' => '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal)
        {
            if (strpos($_registered, $key) === FALSE)
            {
                continue;
            }

            foreach (array_keys($$superglobal) as $var)
            {
                if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE))
                {
                    $GLOBALS[$var] = NULL;
                }
            }
        }
    }
}</code>

不太明白這些程式碼在做些什麼,還有這樣做有什麼好處?
虛心向各位大神請教一二。

回覆內容:

<code>/*
 * ------------------------------------------------------
 * Security procedures
 * ------------------------------------------------------
 */

if ( ! is_php('5.4')) // 如果php版本大于等于5.4
{
    ini_set('magic_quotes_runtime', 0);

    if ((bool) ini_get('register_globals'))
    {
        $_protected = array(
            '_SERVER',
            '_GET',
            '_POST',
            '_FILES',
            '_REQUEST',
            '_SESSION',
            '_ENV',
            '_COOKIE',
            'GLOBALS',
            'HTTP_RAW_POST_DATA',
            'system_path',
            'application_folder',
            'view_folder',
            '_protected',
            '_registered'
        );

        $_registered = ini_get('variables_order');
        foreach (array('E' => '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal)
        {
            if (strpos($_registered, $key) === FALSE)
            {
                continue;
            }

            foreach (array_keys($$superglobal) as $var)
            {
                if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE))
                {
                    $GLOBALS[$var] = NULL;
                }
            }
        }
    }
}</code>

不太明白這些程式碼在做些什麼,還有這樣做有什麼好處?
虛心向各位大神請教一二。

如果在php版本大於5.4的情況下,識別對register_globals狀態,可以看到array裡面都是一些關鍵字,下面的操作都是出於安全性的考慮,如果register_globals是開啟的,意味著各種變量都有被注入的風險,例如你平常用$_POST來取得post方式傳入的參數,如果被注入,就會變成別的動作,所以要進行保護。

register_globals的資料可以參考
http://php.net/manual/zh/security.globals.php

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