1. 程式人生 > >PHP全局變量與SESSION 漏洞(global 與 session)

PHP全局變量與SESSION 漏洞(global 與 session)

自動創建 rac variables 自動 ech array req 導入 isa

先看這一段簡單的代碼
<?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。

PHP全局變量與SESSION 漏洞(global 與 session)