2012-02-16 6 views
1

私は現在自分のウェブサイトを設定しているので、利用可能なファイルのリストを見るにはユーザがログインする必要があります(PHP + Cookies + SQL)。しかし、ファイルは予測可能なディレクトリ形式でアップロードされ、ユーザがURLを知ると、そのファイルを権限のないユーザに公開する可能性があります。それらは単にPDFです。私はディレクトリをどのように保護すべきか興味がありますが、私はそれが.htaccessであると仮定しています。ファイルは、データベースから取得された単純な動的タグを使用してリンクされます。ディレクトリ全体を保護し、ログインしたユーザーがリンクをすばやく表示できるようにする安全で効果的な方法はありますか?許可されていないユーザーをログイン画面にリダイレクトしますか?ありがとう!PHP + htaccess:PDFファイルを保護する

ザック

答えて

0

まず、Webサーバーのディレクトリリストが無効になっていることを確認します。これにより、誰もあなたのすべてのファイルのリストを見ることができなくなります。

第2に、誰かが推測するような方法でファイルに名前を付けます。単純なデータベースID(例:1.pdfなど)を使用しないでください。何らかの種類のハッシュ値を使用するか、または理解しやすいが簡単には推測できない名前を使用してください。

データベースID、タイムスタンプ、ランダム値、およびタグの組み合わせを使用できます。たとえば:

top-secret-document-20120216-77-33.pdf 

はもちろん、ジェームズ・ボンドはWebツリーの外に機密ファイルを移動し、読み込み、ログインしているユーザーのためのファイルを出力するPHPスクリプトを持っているでしょう。

編集:これで、機密ファイルについて言及しました。次に、これについてもっと考える必要があります。ファイルをデータベースに移動することができます。そして/またはhtaccessのクッキーをチェックする。

+0

こんにちはザフ、 お返事ありがとうございます。ファイル名は必ずしも推測するのは簡単ではありませんが、機密情報があり、権限のないユーザー(うまくいけば.htaccess)にそれらを完全に保護するソリューションを期待していました... – Zakman411

+0

@ Zakman411私はファイルをデータベースに格納します。あなたはhtaccessのクッキーもチェックできます。 – zaf

+0

'chmod 711/path/to/secret/directory'(ファイルサーバの所有者がウェブサーバのユーザアカウントではないと仮定します)のファイルシステムのアクセス権を使ってディレクトリ内容を読み取るWebサーバの機能を削除すると、ハッシュ名は特にうまく機能します。ディレクトリを移動するには 'x'実行アクセスのみが必要です。 – sarnold

0

これを実行する最も良い方法は、PHPを使用してファイルを提供し、FilesMatchを使用して.htaccessファイル経由でPDFファイルに直接アクセスすることを禁止することです。

私にこれを行う方法を詳しく説明したい場合は、教えてください。

<FilesMatch "\.(htaccess|htpasswd|pdf)$"> 
    Order Allow,Deny 
    Deny from all 
</FilesMatch> 
+0

これはすばらしいでしょう - どんな助け? – Zakman411

+0

Mark Rの答えには実際に必要とするPHP素材と書き換えルールがありますが、私が追加したコードを追加する限り、Webルートの外側にファイルを置くことについて心配する必要はありません.htaccessファイルに答えてください。 FilesMatchコードは、アクセスを拒否したくないファイルに不注意に影響しないように、PDFが格納されているディレクトリの.htaccessファイルに配置する必要があります。 –

+0

答えに投稿してもよろしいですか?私は実際にWebルート(私はCPanelを使用していると私はそれが可能であるか分からない)外にファイルを移動しないことを好むだろう。 – Zakman411

3

これを行うための唯一の本当の安全な方法は作業ウェブディレクトリの外にファイルを置くとPHPファイルを介してユーザーにログインするためにそれらを提供することです。ファイルに.pdf拡張子を保持させたい場合は、htaccessを使って入ってくるpdf名をあなたのPHPファイルといくつかのパラメータに書き換えることができます。

.htaccessファイル:

RewriteRule ^([A-Za-z0-9-]+).pdf$ index.php?filename=$1 [L,QSA] 

のindex.php:

if($logged_in){ 

    $temp_file = $_GET['filename']; 

    //make sure no one is trying to inject anything funny 
    $temp_file = str_replace('.','',$temp_file);    //prevent file path manipulation 
    $temp_file = str_replace('/','',$temp_file);    //prevent file path manipulation 
    $temp_file = str_replace('%00','',$temp_file);    //prevent null char injector 
    $temp_file = preg_replace('[^A-Za-z0-9]', '', $temp_file); //just to be sure 

$file = STORAGE_DIR.$temp_file.'pdf'; 

    if (file_exists(file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
    } 
} 
else{ 

    header('Location: '.LOGIN_PAGE); 
    exit; 
} 
+0

返信いただきありがとうございます!これは可能性のようです。私の懸念しているのは、データベースからリストを引っ張った後、私のシステムがというタグを使って 'href'パスにPHPを埋め込んでいることだけです。このメソッドをタグに組み込む方法はありますか? – Zakman411

+1

私はこのメソッドを正しく実装すればリンクを変更する必要はないはずです。データベースがyourdomain.com/pdf-files/example.pdfというURLを取得する場合は、作業用Webディレクトリの外にあるpdf-filesディレクトリ内のすべてのpdfファイルを移動し、pdfファイル内にスクリプトとhtaccessファイルをインストールします。 – MarkR

+0

+1のために: – halfer

0

私は、ユーザーのセキュリティを簡単に追加することができたにPHPベースのダウンロードシステムの裸の骨を、持っています。あなたが見たい場合はhereです。 Symfony 1.3とPropelを使用するので、さまざまなデータベースに接続できます。まだF/OSSライセンスはありませんが、必要に応じて追加します!