先看這一段簡單的代碼
<?php
session_start();$_SESSION['isadmin']='yes';$isadmin='no';echo $_SESSION['isadmin'];?>
當php.ini裡配置 register_globals = Off 時,
沒任何問題,
輸出 yes但是
當php.ini裡配置 register_globals = On 的時候,
第一次運行輸出 yes
而重新整理一下,則顯示的是 no顯然這是不正常的,
這是個很奇怪的問題,
如果說是 $isadmin='no'; 改變了SESSION,
那麼為什麼第一次會顯示yes呢?都知道:當配置 register_globals = On 的時候,
通過 xxx.php?id=123 訪問時,程式會自動建立變數 id
那麼自動建立的變數會不會改變SESSION呢?
測試代碼
<?php
//xxx.php
session_start();
echo $_SESSION['id'];
?>
通過 xxx.php?id=123 訪問,沒任何輸出,
還好,不然不知道將有多少
採用 SESSION 做登入的
而PHP配置 register_globals 為 On 的網站
將被隨便登入。還有兩個常用的函數 import_request_variables() 和 extract()
import_request_variables -- 將 GET/POST/Cookie 變數匯入到全域範圍中
extract -- 從數組中將變數匯入到當前的符號表
<?php
//xxx.phpimport_request_variables('G');
echo $id;?>
當通過xxx.php?id=123訪問的時候,
就算 register_globals 設為 Off
也是會輸出123extract($_GET) 與 import_request_variables('G') 功能相似那麼試試import_request_variables() 與 extract()建立的變數會不會影響SESSION呢?
測試代碼
<?php
//xxx.php
session_start();import_request_variables('G');echo $_SESSION['id'];
?>
當通過xxx.php?id=123訪問程式,
沒有輸出,再用extract($_GET)代替import_request_variables('G')測試,
還是沒輸出,這一點又很奇怪了,因為測試
<?php
session_start();
$arr=array('id'=>123);
extract($arr);
echo $_SESSION['id'];
?>
register_globals 為 On 時
會輸出 123看來同樣是數組,
extract 處理 $_GET 與處理定義的數組
用的是不一樣的方法。結論:
register_globals 為 On 的時候,
用import_request_variables('G')和extract($_GET)建立的變數是不會改變SESSION的。總結:漏洞只存在於PHP配置register_globals = On的時候,定義的變數會改變同名的SESSION。