在discuz**中有這麼一段:
if (isset($_request['globals']) or isset($_files['globals']))
register_globals 是php中的乙個控制選項,可以設定成off或者on ,預設為off,決定是否將 egpcs(environment,get,post,cookie,server)變數註冊為全域性變數。
如果 register_globals開啟的話, 客戶端提交的資料中含有globals變數名, 就會覆蓋伺服器上的$globals變數.
所以 這段**, 就是判斷, 如果提交的資料中有globals變數名, 就終止程式。
由此引起的安全問題成為php的「自動全域性變數漏洞」,所以我們要堅決把register_globals關掉。並且使用 $_get, $_post, $_cookie 而非 $_request 。
由於php5.3.x版本php.ini的設定中 request_order 預設值為 gp ,導致discuz! 6.x/7.x中可以繞過全域性變數防禦。
在include/global.func.php中:
function daddslashes($string, $force = 0)
} else
}return $string;
}include/common.inc.php中:
foreach(array('_cookie', '_post', '_get') as $_request) != '_' && $$_key = daddslashes($_value);}}
在register_globals=on時通過提交globals變數就可以繞過上面的**。為了防範這種情況,discuz!中有如下**:
if (isset($_request['globals']) or isset($_files['globals']))
$_request這個超全域性變數的值受php.ini中request_order的影響,在最新的php5.3.x系列 中,request_order預設值為gp,也就是說預設配置下$_request只包含$_get和$_post而不包括$_cookie。通過 cookie就可以提交globals變數。
臨時解決方法:
更改php 5.3.x裡的php.ini設定,設定 request_order 為 gpc 。
php全域性變數漏洞 GLOBALS
在discuz 中有這麼一段 if isset request globals or isset files globals register globals 是php中的乙個控制選項,可以設定成off或者on 預設為off,決定是否將egpcs environment,get,post,cooki...
PHP 全域性變數
全域性變數用關鍵字 global,如宣告乙個全域性變數 global x 函式之外宣告的變數具有global作用域,只能在函式之外進行訪問 函式之內宣告的變數具有local作用域,只能在函式之內進行訪問 如果全域性變數要在函式之內進行訪問,需要在變數前加global,例如 x 5 全域性作用域 fu...
php 全域性變數
描述 php中把定義在函式 類之外的變數稱之為全域性變數,也就是定義在主指令碼中的變數,這些變數可以在函式 成員方法中通過global關鍵字引入使用。1 function test 56 id 1 7test 8echo id 儲存 全域性變數在整個請求執行期間始終存在,它們儲存在eg symbol...