2

PHP を使用して、スクリプトが検証されるとコントラクトを生成するスクリプトを開発しています。

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

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

4

2 に答える 2

4

最も簡単な方法は、おそらく、有効なセッションの存在を必要とするPHPスクリプト(ジェネレータースクリプトのように)を用意することです。その機能は次のとおりです。readfile("/path/to/contract.pdf");

そうすれば、PDFラッパースクリプトで、ダウンロードされているコントラクトが、ディレクトリにあるコントラクトであるだけでなく、セッション内の人にとって正しいコントラクトであることを確認できます。

ディレクトリの.htaccessベースのソリューションの問題は、ディレクトリへの読み取りアクセス権を持つすべてのユーザーが任意のコントラクトをダウンロードできることです。

次のようなURLを指定しhttp://example.com/contract.php?user=132&bill=1ます。

<?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 ()チャンクは、要求されている$userが現在のユーザーに対して有効であることを確認します。明らかに、おそらくこのユーザーが最初にログインしたときに、$ _SESSION['user']を保存する必要があります。

もちろん、実際には、スプールファイルを保持する必要はありません。PDFを生成するプロセスがWebサーバーを圧倒しない場合(および他の問題がある場合)、要求に応じて、各PDFを最初から再生成する方が簡単な場合があります。これが私が現在会社の請求書で行っていることであり、各請求書は、いつ生成されたか、どのIPアドレスからの要求によって生成されたかを示す6ポイントのフッターを取得します。:)

于 2012-04-04T03:24:32.303 に答える
3

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

これは、PDFの取得元にリクエストを渡すMod_Rewriteルールを、URLからユーザーIDとドキュメントIDを取得し、アクセス制御を実行するPHPスクリプトに渡すことでシームレスにできます。このスクリプトが成功すると、ファイルの内容が出力されます。

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

于 2012-04-04T03:24:12.623 に答える