2016-04-30 8 views
0

のGETによって作成されたURL文字列を保護する方法私は特定のディレクトリをスキャンするためのアンカーを作りたいと思っています。ファイル管理のために

私はそれのために、このエコーを使用します。

echo "<div class='urldir'>" 
."<a href='?dir=".dirname($dir).'/'.basename($dir).'/'.$file."'>open dir</a>" 
."</div>"; 

のdirnameとのbasename私のディレクトリへの正しい道を与えます。

これはユーザーのための通常の「ルート」ディレクトリです:私は、ユーザーが自分のルートにフォルダを作成したとき、彼はディレクトリを変更folder.Toその内のファイルを見ることができなければなりません

$dir = 'uploads/sfm/'.$UserID; 

とそのディレクトリ内のすべてのファイルを表示し、私はこの

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; 


$strArr = explode("=",$actual_link); 
$CurrentPath = $strArr[1]; 


if(isset($_GET['dir'])) { 
$dir = $CurrentPath; 

} 

を使用するので、私はURLからディレクトリを読み込み、変数$dirが問題

を変更:Uを私は、URLになりまし入力すると

sfm?dir=uploads/sfm/c4ca4238a0b923820dcc509a6f75849b/folder

:RLは、私にこのような文字列を示し

sfm?dir=uploads/

彼はアップロードフォルダ内のファイルを私に示しています。これは保護されなければなりません! 誰もこれを見ることができません。 また、これは表示から保護する必要があります。 sfm?dir=uploads/sfm/

どうすれば実現できますか?ところで

:私は、変数$ユーザーIDのMD5が 試料溶液は、正規表現を使用して、MD5ディレクトリをつかむためにあるmd5($UserID)

答えて

1
$protectedDirectories = array( 
          array('uploads', 'sfm', $userId) 
         ); 

$directory = str_replace('\\','',$_GET['dir']); 

$directory = trim($directory,'/'); 

$directory = preg_replace('#[\/]{1,}#','/',$directory); 

$stats = false; // True = Protected , False = Cannot enter this directory. 

$seperate = explode('/',$directory); 

$cntSeperate = count($seperate); 

foreach($protectedDirectories as $pattern){ 

    if(count($pattern) > $cntSeperate){ 

     continue; 

    } 

    $innerStats = true; 

    foreach($pattern as $key => $val){ 

     if($seperate[ $key ] !== $val){ 

      $innerStats = false; 

      break; 

     } 

    } 

    if($innerStats == false){ 

     continue; 

    } 

    $stats = true; 

    break; 

} 

if($stats == true){ 

    // Access Granted 

}else{ 

    // Access Not Granted 

} 

今、あなたは動的にディレクトリのアクセス許可を使用することができます。各配列はパターンを意味します。各配列の値はディレクトリ内のディレクトリです(例:array( 'uploads'、 'sfm')はアップロード/ sfmを意味します)

1

をハッシュ化された持っているので、URLのハッシュです。このような

何か:

$res = preg_match('/uploads\/sfm\/([a-f0-9]{32}).*/', $dir, $matches); 

if (!$res || $matches[1] != md5($UserID)) { 
    // user requested a directory he has no access to. Take additional 
    // actions, e.g. return HTTP status 403 
    exit('No access here'); 
} 
+0

が素晴らしいようです。ちょうどもう一つの問題:ユーザーがルートを探しているとき、URLは 'http:// example.coml/sfm'なので、もしURLがそうならば、アクセスする必要があります。 –

+0

これは簡単です。 dir変数が空の場合(例: '空であれば($ _GET ['dir'])... 'アクセスを許可します! – antoniom

関連する問題