Notice: A session had already been started - ignoring session_start() in D:\Apacheroot\test\test.php on line 2 Notice: Undefined index: test in D:\Apacheroot\test\test.php on line 3 NULL?
string(2) "/b"?
刷新后返回:
Notice: A session had already been started - ignoring session_start() in D:\Apacheroot\test\test.php on line 2 string(7) "/notice"?
2016-07-08
首先來看php官方手冊對于$_SERVER['PATH_INFO']的注解:
該值為客戶端提交的任意路徑信息,取值為在實際腳本名稱之后并且在查詢字符串之前,例如假設當前url為 /php/path_info.php/some/stuff?foo=bar,那么$_SERVER['PATH_INFO']取值為/some/stuff
接下來再看如下這段代碼:test.php
<?php?
session_start();?
var_dump($_SESSION['test']);?
echo'<br />';?
$_SESSION['test']=$_SERVER['PATH_INFO']; var_dump($_SESSION['test']);?
?>?
<img src="notice"/> 訪問url:http://localhost/test.php/a
返回頁面:
Notice: A session had already been started - ignoring session_start() in D:\Apacheroot\test\test.php on line 2 Notice: Undefined index: test in D:\Apacheroot\test\test.php on line 3 NULL?
string(2) "/b"?
刷新后返回:
Notice: A session had already been started - ignoring session_start() in D:\Apacheroot\test\test.php on line 2 string(7) "/notice"?
string(2) "/b"?
?
發(fā)現(xiàn)什么奇怪的地方嗎?
刷新后var_dump($_SESSION['test'])返回的是/notice,和img標簽的地址一樣,為什么會這樣呢?
原因就在于<img src="notice"/>瀏覽器訪問加載了/test.php/notice,這時觸發(fā)了test.php,導致$_SERVER['PATH_INFO']變量改變,也就導致session變量改變,所以每當刷新頁面,$_SESSION['test']輸出的都是notice。
?
那么這樣會導致什么安全隱患呢?
img標簽中的地址任意內(nèi)容都可以輸出到網(wǎng)頁中去,并在session內(nèi)有效,也就是形成了天然的(反射+存儲+dom型)XSS/CSRF,因為絕大多數(shù)安全防護類軟件只掃描webshell,一句話木馬等內(nèi)容,并不掃描js腳本內(nèi)容,所以可以免殺,其他危害還可以隨環(huán)境而定
2016-07-08
var_dump()方法是判斷一個變量的類型與長度,并輸出變量的數(shù)值,如果變量有值輸?shù)氖亲兞康闹挡⒒胤禂?shù)據(jù)類型.$_SESSION是用于存儲和取回 session 變量,所以這句話的意思是判斷session的類型和長度并輸出session的數(shù)值