1. 程式人生 > >PHP全域性變數與SESSION 漏洞(global 與 session)

PHP全域性變數與SESSION 漏洞(global 與 session)

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