復制代碼 代碼如下:
<?php
///讀取模塊名稱
$mod = isset($_GET['m'])?trim($_GET['m']):'index';
///過濾目錄名稱不讓跳轉到上級目錄
$mod = str_replace("..",".",$mod);
///得到文件
$file = "/home/www/blog/".$mod.".php";
///包含文件
@include($file);
$mod 通過構造輸?mod=…%2F…%2F…%2F…%2Fetc%2Fpasswd%00 ,我們看結果將是:
居然include(“/etc/passwd”)文件了。
怎么逃脫了我參數限制呢?
首先:做參數過濾類型去限制用戶輸入本來就不是一個好方法,一般規則是:能夠做檢測的,不要做替換 只要是檢測不通過的,直接pass 掉!這是我們的一個原則。過濾失敗情況,舉不勝舉,我們來看看,實際過程。
1、輸入”…/…/…/” 通過把”..” 替換為”.”后
2、結果是”../../../” 就變成了這個了
有朋友就會說,如果我直接替換為空格是不是就好了?在這個里面確實可以替換掉。但是不代表以后你都替換為空格就好了。再舉例子下。如:有人將字符串里面javascript替換掉。代碼如下:
復制代碼 代碼如下:
……
$msg = str_replace(“javascript”,””,$msg);
1.什么是白名單限制
復制代碼 代碼如下:
舉例來說:
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///讀取模塊名稱后
mod變量值范圍如果是枚舉類型那么:
if(!in_array($mod,array(‘user','index','add','edit'))) exit(‘err!!!');
完全限定了$mod,只能在這個數組中,夠狠!!!!
2.怎么做白名單限制
通過剛才例子,我們知道如果是枚舉類型,直接將值放到list中即可,但是,有些時候,這樣不夠方面。我們還有另外一個白名單限制方法。就是限制字符范圍
復制代碼 代碼如下:
舉例來說:
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///讀取模塊名稱后
我限制知道$mod是個目錄名稱,對于一般站點來說,就是字母加數字下劃線之類。
if(!preg_match(“/^/w+$/”,$mod)) exit(‘err!!!');
字符只能是:[A-Za-z0-9_] 這些了。夠狠!!!
新聞熱點
疑難解答