<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