htmlentities
用htmlentities($_SERVER[』 PHP_SELF』])來替代簡單的$_SERVER[』PHP_SELF』],這樣即使網址中包含惡意代碼,也會被「轉換」為用於顯示的html代碼, 而不是被直接嵌入html代碼中執行,簡單一點說,就是「<」會變成「<」,變成無害的了。
REQUEST_URI
用$_SERVER[』REQUEST_URI』]來替代$_SERVER[』PHP_SELF』],在phpinfo()中可以看到這兩個變量的區 別:_SERVER[」REQUEST_URI」] /fwolf/temp/test.php/%22%3E%3Cscript%3Ealert(』xss』)%3C/script%3E %3Cfoo_SERVER[」PHP_SELF」] /fwolf/temp/test.php/」>
$_SERVER[』 REQUEST_URI』]會原封不動的反映網址本身,網址中如果有%3C,那麼你得到的也將會是%3C,而$ _SERVER[』PHP_SELF』]會對網址進行一次urldecode操作,網址中的%3C將會變成字符「<」,所以就產生了漏洞。需要注意 的是,在很多情況下,瀏覽器會對用戶輸入要提交給web服務器的內容進行encode,然後服務器端程序會自動進行decode,得到相應的原指,在我們 進行post或者get操作的時候都是這樣。
另外還有兩點需要指出,第一是這種寫法雖然沒有直接用到$_SERVER[』 PHP_SELF』],但實際效果卻是一樣的,只是發生的時間錯後到了用戶提交之後的下一個頁面,所以,form的action還是不要留空的好。第二 點,除了PHP_SELF之外,其他的$_SERVER變量也許也會有類似的漏洞,比如SCRIPT_URI, SCRIPT_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等,在使用他們之前一定要先作htmlentities之類的轉換。
原文出處:
http://wiki.guoshuang.com/Php_$_SERVER_%22PHP_SELF%22_%E6%BC%8F%E6%B4%9E"
該函數做甚麼用呢?目前網頁變數名稱
http://www.php.net/manual/en/reserved.variables.server.php
example:
action="<?php echo $_SERVER['PHP_SELF']" ?>
超全域變數,代表目前網頁
example:
action="<?php echo $_SERVER['PHP_SELF']" ?>
超全域變數,代表目前網頁
沒有留言:
張貼留言