線上書籍

Home

[991]PHP網站開發 進階應用技巧2

一、切換目錄並避免跨目錄攻擊

 

$base_dir="D:/httpd/08/uploads";
$base_url="http://localhost/08/uploads";
$dir=(empty($_GET['to']))?$base_dir:$_GET['to'];
$dir=str_replace("\\","/",realpath($dir));
if(!ereg("^".$base_dir,$dir))$dir=$base_dir;
$url=str_replace($base_dir,$base_url,$dir);
define("_UPLOAD_DIR",$dir);
define("_UPLOAD_URL",$url);
//定義基本目錄路徑
//定義目錄的網址
//若有傳入 to 變數則以新位置為主
//取得真實路徑,並把win的路徑改為 /
//若新位置開頭和$base_dir不同,則改回原位置
//製作新的目錄網址
//把新路徑定義到為基本目錄路徑
//把新網址定義到目錄網址

1.realpath("路徑")→轉換為真實路徑
2.ereg("規則","字串")→正規表達式比對
3.str_replace("找出","換為","字串")→字串替換

二、刪除檔案
<a href='index.php?file={$file}&to="._UPLOAD_DIR."&op=del'>刪除</a>
底下請放在$dh=opendir(_UPLOAD_DIR);之前
if($_GET['op']=="del"){
   $file=mb_convert_encoding($_GET['file'], "Big5", "Big5,UTF-8");
   @unlink(_UPLOAD_DIR."/{$file}");
   header("location:"._UPLOAD_DIR);
}

//加入刪除功能

//若有指定刪除動作
//先把檔名轉為系統編碼
//刪除檔案(隱藏錯誤)
//執行後轉向到原位置

1.mb_convert_encoding("字串","新的編碼","原始編碼")→轉換字串編碼
2.unlink("路徑")→刪除檔案

三、多檔刪除

請先在表格前後加上 <form action='index.php' method='post'> 表格 </form>


<input type='checkbox' name='files[]' value='{$file}'>


<tr><th colspan='4'>
將勾選的檔案 <input type='radio' name='op' value='del'>刪除
<input type='hidden' name='to' value='"._UPLOAD_DIR."'>
<input type='submit' value='送出'></th></tr>


//加入多選框


//表格下方加入一列
//勾選要進行之動作
//送出目前目錄
//送出按鈕

底下請放在原本刪除功能之後,記得將送出之參數將$_GET改為 $_REQUEST
foreach($_POST['files'] as $file){
    $file=mb_convert_encoding($file, "Big5", "Big5,UTF-8");
    @unlink(_UPLOAD_DIR."/{$file}");
}


//把要刪除檔案用迴圈讀出
//先把檔名轉為系統編碼
//刪除檔案

四、搬移檔案

在刪除後面加上搬移的選項,其中 folder_select() 為自訂函數,用來列出目錄選單:

<input type='radio' name='op' value='move'>
搬到:".folder_select($base_dir,"new_folder")."
//加入搬移選項
//列出目錄選單

將之加在 if($_GET['op']=="del") 之後

}elseif($_REQUEST['op']=="move"){
  foreach($_POST['files'] as $file){
    $file=mb_convert_encoding($file, "Big5", "Big5,UTF-8");
    @rename(_UPLOAD_DIR."/{$file}",$_POST['new_folder']."/{$file}");
  }
  header("location:"._UPLOAD_DIR);
}
//若有指定搬移動作
//把要搬移檔案讀出
//先把檔名轉為系統編碼
//搬移檔案(隱藏錯誤)

//執行後轉向到原位置
五、建立資料夾

在刪除前面面加上建立新目錄欄位

在此建立新目錄:<input type='text' name='mk_folder'><br> //加入建新目錄欄位

請自訂一組 }elseif(!empty($_POST['mk_folder'])){

$mk_folder=mb_convert_encoding($_POST['mk_folder'], "Big5", "Big5,UTF-8");
mk_dir(_UPLOAD_DIR."/{$mk_folder}");
//加入建新目錄欄位
//建立目錄