php unlink使い方を間違えると恐ろしい事に。

unlinkのエラーで意図しないファイルが削除されてしまい、真っ白のページになってしまった問題。

$data_dir=”../file/page1/test”;
↑最後にスラッシュがないパス

ディレクトリの特定は出来る。

opendir()で中身を$filenameに。

しかしここで↓
unlink($data_dir.$filename)
渡したパスは、$filenameがtest.txt だとすると、”../file/page1/testtest.txt”になってしまう。
当然エラー。

パスの最後にスラッシュを付けると、”../file/page1/test/test.txt” 大丈夫である。

これはまだ恐ろしくない。

次のケース。

function deleteDir($dir){
    if (!$handle=opendir($dir)) 
	$er=true;
	 while( false != ($filename = readdir( $handle ) ) ){
         if($filename == '.' ||$filename == '..'){
         }else{
                   if(!unlink($dir.$filename)){
                          $er=false;
                  } 
          }
	}
     closedir($handle);  
     return $er;
}

削除したいディレクトリのパスを渡してディレクトリ内のファイルを削除する関数。

こういう使い方をした場合。
deleteDir(‘../’.$path);
この時$pathが存在しない変数だと、deleteDir(‘../’);これと同じになってしまう。

一つ上の階層のディレクトリ、ファイルを全削除せよ!だ。恐ろしい!

Warning: unlink(../add): Operation not permitted
Warning: unlink(../css): Operation not permitted

こういうのがいっぱい出た。
辛うじてパーミッション設定でディレクトリは削除されなかったが、’../’の階層にあったファイルは全部削除された。

if( file_exists($dir.$filename) ) {
     if(!unlink($dir.$filename)){
     $er=false;
      } 
 }

こうやって存在確認をしてから使うのが常識なのだろうが、見落としてしまった。

コメント