1

コード内のリンクをクリックしてファイルをダウンロードのみ可能にし、URL をコピーしてアドレス バーに貼り付けてファイルにアクセスしようとすることでアクセスを制限できるかどうか知っていますか?

例:

請求書を PDF として生成します。ログインしている顧客と、この特定の顧客に対して生成された請求書のみが利用できるようにしたいと考えています。顧客 A は顧客 B からの請求書を見ることができず、その逆も同様です。

これらの請求書をここに保存します: www.mydomain.com/invoices/

顧客 A の請求書は次のようになります: www.mydomain.com/invoice/20130202_120045.pdf

HTML で次のようなリンクを追加すると、顧客がこの PDF のみを表示できるようにしたいと考えています。

<a href="http://www.mydomain.com/invoice/20130202_120045.pdf">See invoice</a>

ただし、アドレス バーに www.mydomain.com/invoice/20130202_120045.pdf と直接入力して PDF にアクセスすることはできません。

これは何らかの形で可能ですか?

4

3 に答える 3

4

複数のアプローチがありますが、これが最も簡単な方法だと思います。

  • 実際の PDF を、PHP のみがアクセスできるディレクトリ (Web ルートの外部またはブロック.htaccessなど) に保存します。
  • PHP スクリプトでアクセスを確認します。
  • ヘッダーContent-dispositionを使用してファイル名を設定しreadfile()、ファイルの内容を出力するために使用する PHP スクリプトを介してダウンロードを実行します。
于 2013-02-05T10:36:39.290 に答える
2

確かに - 最も簡単な方法は.htaccessを使用することです。URL 経由でダウンロードできないすべてのファイルを 1 つのフォルダーに保存し、それらすべてを PHP スクリプトにリダイレクトできます。

このようにして、ユーザーが をダウンロードしようとするとhttp://www.mydomain.com/invoice/20130202_120045.pdf、(バックグラウンドで .htaccess を介して) どこかの PHP スクリプトにリダイレクトされます。

その PHP スクリプトは、その人物が (セッション、Cookie などを介して) 承認されているかどうかを確認し、承認されている場合は元のファイルのみを出力します (承認されていない場合はエラー メッセージ)。

fgets()関数を使用してファイルを分割して出力し、サーバーのメモリが過負荷にならないようにすることができます。

このアプローチの欠点はスケーラビリティです。ユーザーがダウンロードするファイルが多いほど、実行する必要のある PHP スクリプトが多くなり、ある時点で Apache が過負荷になる可能性があるためです。しかし、コードが適切に書かれている場合 (つまり、 fgets()などを使用している場合)、それは起こりそうにありません。

于 2013-02-05T10:37:22.017 に答える
0

これを使うmod_xsendfileのはとても簡単です。ファイルをドキュメント ルートの外に貼り付け、Apache に代わりにファイルを送信するように指示する特別なヘッダーを発行します。

設定後のコードは次のように単純です。

<?php
...
if ($user->isLoggedIn())
{
    header("X-Sendfile: $path_to_somefile");
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$somefile\"");
    exit;
}
?>
<h1>Permission denied</h1>
<p>Login first!</p>

ソース コードは、モジュール ページ自体から取得されます。

于 2013-02-05T11:13:15.357 に答える