2012-03-13 22 views
2

私はかなり新しいPHPであり、この簡単なダウンロードスクリプトを一緒に文字列にすることができました。ここに記載されている質問のいくつかを読んで、PHPをよく知っている人に聞いてみてください下のコードで、私の実装や変更すべき何かに目立った欠陥があるかどうかを確認してください。単純なファイルのダウンローダー

私の限られたテストの間、すべてがうまくいくように見えましたが、私が言ったように、私はかなり新しいPHPですし、後で道を辿ってスクリプトを壊してしまうかもしれないことを確かめたい。

<?php 

//Settings 
$filesPath = './files'; 
$fileName = $_GET['file']; 
$allowedExts = array('jpg','png','gif'); 


//Functions 
//Returns the extension portion of a filename. 
function file_extension($fileName) 
{ 
    $path_info = pathinfo($fileName); 
    return strtolower($path_info['extension']); 
} 

//Validation and processing 
//Check that a file is actually being requested 
if (empty($fileName)) { 
    die('no file was requested'); 
} 

//Check that the file is allowed to be downloaded 
if (!in_array(file_extension($fileName), $allowedExts)) { 
    die('you cannot download this file'); 
} 

//Get the file 
if (file_exists($filesPath . DIRECTORY_SEPARATOR . $fileName)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename=' . basename($fileName)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($fileName)); 
    ob_clean(); 
    flush(); 
    readfile($fileName); 
    exit; 
} 
?> 

TIA、 デイブ

+0

ないセキュリティ関連から保護する方法についていくつかのチェックを行いますが、あなたが持つべき 所有、ハッカーの攻撃に開いていますあなたのダウンロードを途中で中断したくない場合は、 'set_time_limit(0);'を参照してください。http://php.net/manual/en/function.set-time-limit.php – Ben

+0

ありがとうございました。設定、私のホストはそれを賞賛するかわからないtho。 –

+0

設定としてではなく、PHPコードの最上部近くに 'set_time_limit(0);'を追加してください – Ben

答えて

3

スクリプトは、ディレクトリトラバーサルの脆弱性があります。あなたの場合は、ファイル名にrealpath()を使用し、それが.files/内の有効なファイルであることを確認します。

誰かがディレクトリツリーを走査して/etc/passwdなどのファイルを盗む可能性があります。

+0

ありがとう、私はそれを調べますが、拡張機能のチェックでは、 allowedExt配列には? –

+0

更新するだけですこのdownload.php?file = ../../../../../etc/passwdのようなものでURLを走査しようとしましたが、403禁じられたエラーメッセージを受信しました。この脆弱性をテストします。 –

+0

あなたのWebサーバーは、独自のユーザーアカウントで設定されている可能性があり、特定のディレクトリまたはSuPHPを実行するためにのみアクセスできます。しかし、ひどく設定されたサーバでスクリプトが実行される場合には、このようなチェックを行うことは良い習慣です。 – F21

0

誰かがちょうど何ができる?ファイル= ../etc/passwdファイル/及びBAMあなたはより良いLFI