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 可能会更容易。这就是我现在对公司发票所做的事情,每张发票都有一个 6 点的页脚,说明它是何时生成的,以及来自哪个 IP 地址的请求。:)

于 2012-04-04T03:24:32.303 回答
3

首先,您将 PDF 文件放在站点的 Web 根目录之外并通过脚本检索它们。

这可以通过将 Mod_Rewrite 规则组合到一个 PHP 脚本中来实现无缝连接,该规则将请求传递到 PDF 将被检索到的位置,该 PHP 脚本从 URL 获取用户和文档 ID 并执行访问控制,如果成功,则输出文件的内容。

有关如何使用 PHP 代码执行 HTTP 级别身份验证的详细信息,请参阅PHP 手册。

于 2012-04-04T03:24:12.623 回答