2017-05-22 7 views
0

私はWebアプリケーションを開発しており、画像とPDF文書を保存して表示する必要があります。ディレクトリへの直接アクセスは拒否できますが、PHPスクリプトから許可するにはどうすればよいですか?

イメージとドキュメント、およびそのコンテナファイルへの直接アクセスを拒否したかったのです。つまり、誰かがURL経由でフォルダにアクセスしようとすると、403-forbiddenエラーが発生するはずです。 PHPスクリプトを経由して、この

header('content-type: application/pdf'); 
readfile('../../../files/'.$document); 
のようなPDFファイルdocmentsへのアクセスは問題ありません、

Order deny,allow 
Deny from all 

私のWebアプリケーションを使用する:このため

は、私はこのようなフォルダ内の.htaccessファイルを作成しました

しかし、<img style=max-width:100% src=../files/'.$image.'>'を使用して画像にアクセスしようとすると、アクセスが拒否され、httpステータスコード403が禁止されます。

ウェブアプリケーションを使用して画像にアクセスできますが、画像への直接アクセスを拒否するにはどうすればよいですか?

また、なぜpdfドキュメントにアクセスできるのか知りたいのですが、画像にアクセスできません。

+0

ユーザーがログインしていて正しい権限を持っていることを確認するスクリプトを作成し、そのスクリプトを使用してすべてのファイルを提供します。 (別名、file.phpという名前のファイルを作成し、それにドキュメントIDを渡します。スクリプトはユーザーのアクセスレベルを確認し、使用するファイルを読み込みます。あなたのimgタグは 'src = '../file.php?img = 12''かそうでなければなりません) – Dimi

答えて

1

これらのファイルタイプのいずれかにハンドラを使用します。

ファイルをWebアクセス可能なファイルシステムの外部に配置します。つまり、ウェブルートが/ var/www/htmlの場合は、/ var/www/files /ディレクトリを作成し、そこにすべてのファイルを保存します。

$file_id = intval($_REQUEST['file_id']); 

$sql = sprintf("SELECT * FROM files WHERE file_id=%d",$file_id); 
$query = $mysqli->query($sql); 
$file = $result->fetch_assoc() 

// add business logic for 
// if $user_id is allowed to view $file_id 

if (preg_match("/\.pdf$/i",$file['filename'])){ 
    header('content-type: application/pdf'); 
} else if (preg_match("/\.(jpg|gif|png)$/i",$file['filename'])){ 
    header('content-type: application/pdf'); 
} else { 
    die("Unknown file type"); 
} 

$full_path = sprintf("/var/www/files/%s",$file['filename']); 
readfile($full_path); 

これは、ユーザーがアクセスする必要のあるファイルを特定のアクセスを記録し、ウェブアクセス可能なディレクトリからそれらを保つために、アプリケーションのロジックを使用することができるようになります。

ので、代わりのこの

<img style=max-width:100% src=../files/'.$image.'>' 

のようなものを使用して、私は、画像に

<img style=max-width:100% src=/handler.php?file_id='.$file_id.'>' 

やPDF

<img style=max-width:100% src=/handler.php?file_id='.$file_id.'>' 
をダウンロードするためのこのようなリンクを処理するために次のような構文を使用することをお勧めし

これは、あなたがPDFと画像のデータベースを持っていることを前提とするとかなり簡単です。このような単純なもの。

CREATE TABLE `files` (
    `file_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `file_name` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`file_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

最初のコードはどこに書きますか?また、それは何ですか? フォルダ内のファイルに直接アクセスできるため、2番目の方法は機能しません。 – al2593

+0

私は手助けすべき別のアプローチを追加しました。私はあなたのPDFファイルのアクセスハンドラを持っていると仮定している、これはあなたがイメージハンドラのために呼び出すのと同じハンドラになります。 – jbrahy

0

それはあなたのWebアプリケーションをホストしているローカルサーバーのアドレスから許可するルール、

Order deny,allow 
Deny from all 
allow from 127.0.0.1 

の下で試してみてください。

編集:

Options -Indexes 

があまりにもディレクトリ一覧をオフにするには、上記使用し、それは禁止エラーが発生します。

+0

動作しません。私はまたlocalhostとfrom :: 1からallowinfgを試しました。最後の問題は、引き続きフォルダに直接アクセスできることです。 – al2593

関連する問題