2012-04-04 21 views
1

PHPを使用して、スクリプトが検証されると契約を生成するスクリプトを開発しています。PHPを使用したpdfページへのアクセス制限

契約書はTCPDFで生成されたpdf文書で、ユーザーのIDを持つサブディレクトリにサーバーに保存します。たとえば、「contracts/132/1.pdf」はID 132のユーザーの請求書番号1となります。

ただし、個人情報が含まれているため、ユーザー132のみがそのファイルにアクセスできるようにします。各サブフォルダのpdfドキュメントへのアクセスをそれぞれのユーザに制限するにはどうすればよいですか(phpまたはhtaccessを使用して、どちらが最もうまくいくか - 私はhtaccessに慣れていません)。

答えて

2

最も簡単な方法は、(発電スクリプトがないように)だけで有効なセッションの存在を必要とするPHPスクリプトを持っているおそらく、その機能があるreadfile("/path/to/contract.pdf");

にそのように、あなたはあなたのPDFのラッパースクリプトを持つことができますダウンロードされている契約がディレクトリ内の契約であるだけでなく、sesion内の人物の正しい契約であることを確認します。

ディレクトリに対する.htaccessベースのソリューションの問題は、ディレクトリへの読み取りアクセスを持つすべてのユーザーが任意の契約をダウンロードできることです。あなたはできるhttp://example.com/contract.php?user=132&bill=1のようなURLが与えられ

:真ん中に

<?php 

$user = $_GET['user']; 
$bill = $_GET['bill']; 
# do input validation on $user and $bill. No really, do it. 

if ($user != $_SESSION['user']) { 
    die("Security error; the black choppers are on their way."); 
} 

header("Content-type: application/pdf"); 
header('Content-Disposition: attachment; filename="Contract-$user-$bill.pdf"'); 

readfile("/path/to/pdfspool/$user/Contract-$user-$bill.pdf"); 

if()チャンクが要求されている$のユーザーは、現在のユーザーのために有効であることを確認します。明らかに、$ _SESSION ['user']を保存することをお勧めします。おそらく、このユーザーが初めてログインするときです。

もちろん、スプールファイルを保存する必要はありません。 PDFを生成するプロセスがあなたのWebサーバーを圧倒することがないならば(もしそれが他の問題を抱えていれば)、要望に応じて各PDFを最初から再生成するほうが簡単かもしれません。これは今私が会社の請求書で行うことであり、各請求書には、生成されたときと、どのIPアドレスからの要求によって、6ポイントのフッターが表示されます。 :)

+0

ユーザがアドレスバーのPDFスクリプトの直接URLを入力するのに十分な場合はどうすればよいですか?たとえば、www.mysite.com/contracts/124/5.pdfと入力します。 –

+0

が更新されました。 $ userをセッション変数に対して検証するコードにセクションを追加しました。 – ghoti

2

まず、PDFファイルをサイトのWebルートの外に置き、スクリプトを使用してそれらを取得します。

これは、PDFを取得する場所にリクエストを渡すMod_Rewriteルールと、URLからユーザーIDとドキュメントIDを取得し、アクセス制御を実行するPHPスクリプトとを組み合わせることで、シームレスに行うことができます。ファイルの内容。

PHPコードを使用してHTTPレベルの認証を実行する方法の詳細については、the PHP Manualを参照してください。

+0

「サイトのWebルートの外部にPDFファイルを置く」とはどういう意味ですか?あなたは例でそれを説明できますか? –

+0

あなたのウェブルートが '/ home/user/public_html'にある場合は、ファイルを'/home/user/pdfs'に置きます。 PHPが '/ home/user/pdfs'ディレクトリの内容を読むことができれば、ファイルの内容を取り出すことができますが、Webから直接アクセスすることはできません。 – Ariel

+0

ありがとう、私はその賢明なアイデアを考えていませんでした。 –

関連する問題