簡介:這是php函數偽靜態、MVC單一入口與檔案上傳安全性漏洞的詳細頁面,介紹了和php,有關的知識、技巧、經驗,和一些php源碼等。
class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=334787' scrolling='no'>
php中有一個讓人不解的特性,那就是,如果檔案名稱中有".php",則會自動調用PHP引擎,當成PHP指令碼處理。
php的函數偽靜態也是這樣做出來的。
以下是函數偽靜態所用的函數:
function MakeUrl($arr){ foreach($arr as $key=>$value){ $url[]=$key."_".$value; } $tmpurl=implode("_",$url); return $tmpurl.".htm"; } function ParseUrl(){ if($_SERVER['PATH_INFO']!=""){ $pathinfo=substr($_SERVER['PATH_INFO'],1); $pathinfo=str_replace(".htm","",$pathinfo); $path=explode("_",$pathinfo); $count=count($path); for($i=0;$i<$count;$i+=2){ $_GET[$path[$i]]=$path[$i+1]; } } } //使用執行個體,連結頁面 $path="http://www.tiaotiaola.com/blog.php/"; $path.=MakeUrl(array('BlogID'=>2,'page'=>1)); 以上兩行代碼產生頁面中的URL。//瀏覽頁面,調用函數ParseUrl();直接可以使用變數$_GET
當然,很多MVC架構中,均支援這樣的功能,但在MVC架構中,並不一定是用上面兩個函數實現的了。
其實,它不僅是偽靜態所需。同時也是MVC所必須要的功能。這是因為,MVC中的所謂的單一入口,也是憑此功能實現的。
我們可以見到很多網站,連結象 http://www.tiaotiaola.com/s/2/3/4/5.html
實際是經過.htaccess,或者是UrlRewrite處理過的。未處理之前是:http://www.tiaotiaola.com/s.php/2/3/4/5.html
s.php一定是MVC的入口檔案。
這就是說,some.php.png,s.php/2/3/4/5.html這樣的檔案,均會當成PHP檔案被執行。
這也就引發了另一個問題:
如果我上傳一個檔案,名為:some.php.png,那我肯定能夠上傳成功。
因而,我就可以在上傳成功後,再次請求這一個URL。於是,駭客攻擊就能輕鬆實現。
當然,要阻止這一問題並不難,第一,我們可以在上傳目錄增加一個.htaccess,內容如下,
<Directory "/uploads/">
<Files ~ ".php">
Order allow,deny
Deny from all
</Files>
</Directory>
很顯然,它的目的就是禁止檔案以PHP方式執行。
另外,最徹底的解決辦法,則是:對所有的上傳檔案均進行改名。即不儲存原始檔案名。如果要儲存,則必須去掉檔案名稱中的"."以及其它可能有攻擊性的文法。
我們推薦的做法是不儲存原始檔案名,即對原始檔案名用md5或sha進行hash,如果要區分上傳時間,可以加上時間戳記,即產生的是純a-z0-9文字的檔案名稱。最後加上原始副檔名即可。
愛J2EE關注Java邁克爾傑克遜視頻站JSON線上工具
http://biancheng.dnbcw.info/php/334787.html pageNo:10