PHP漏洞防範 (一) - register_globals=On的安全性問題  

最要的php.ini選項:RegisterGlobals

php版本<4.2.0時,php.ini的register_globals選項的預設值為On,當register_globals的設定為On時,程式可以接收來自服務器的各種環境變量,包括表單提交的變量,而且由於PHP不必事先初始化變量的值,從而導致很大的安全隱患。也就是一種把所有參數收進來都當成全域變數儲存的功能。所以從PHP 5.3開始,為了更好的向PHP的未來版本(PHP6)過渡,將未來不再支持的函數標記為DEPRECATED(棄用)。在代碼中使用這些函數,將毫不留情的在頁面中顯示警告信息:「使用了過時的函數…」,使得程式無法正常執行。

例1:

//check_admin()用於檢查當前用戶權限,如果是admin設置$is_admin變量為true,然後下面判斷此變量是否為true,然後執行管理的一些操作。

if(check_admin()) 
{ 
$is_admin=true; 
} 
if($is_admin) 
{ 
do_something(); 
} 

這一段代碼沒有將$is_admin事先初始化為Flase,如果register_globals為On,那麼我們直接提交http://domain/ex1.php?is_admin=true,就可以繞過check_admin()的驗證。

 

例2:

//ex2.php 

    if(isset($_SESSION["username"])) 
    { 
    do_something(); 
    } 
    else 
    { 
    echo"您尚未登錄!"; 
    } 

register_globals=On時,我們提交http://domain/ex2.php?_SESSION[username]=dodo,就具有了此用戶的權限所以不管register_globals是什麼,我們都要記住,對於任何傳輸的數據要經過仔細驗證,變量要初始化。

文章標籤

周宇若 發表在 痞客邦 留言(0) 人氣()