使用php限制对pdf页面的访问

时间:2012-04-04 03:20:02

标签: php pdf

使用PHP,我正在开发一个脚本,一旦验证了脚本,就会生成合同。

合同是使用TCPDF生成的pdf文档,我将其保存到具有用户ID的子目录中的服务器上。例如,'contracts / 132 / 1.pdf'将是ID为132的用户的账单#1。

但是,我只希望用户132能够访问该文件,因为它包含个人信息。如何限制每个子文件夹中pdf文档对各自用户的访问权限(使用php或htaccess,哪个效果最好 - 我对htaccess不是很熟悉)?

2 个答案:

答案 0 :(得分:2)

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

通过将请求传递到请求的地方的Mod_Rewrite规则与从URL获取用户和文档ID并执行访问控制的PHP脚本相结合,可以实现无缝化,如果成功,则输出文件的内容。

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

答案 1 :(得分:2)

最简单的方法可能就是拥有一个需要存在有效会话的PHP脚本(比如生成器脚本),其功能是readfile("/path/to/contract.pdf");

这样,您可以让您的PDF包装器脚本验证正在下载的合同是该人员的合同,而不仅仅是它是目录中的合同。

目录上基于.htaccess的解决方案的问题是,对该目录具有读访问权限的任何人都可以下载任何合同。

根据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地址的请求。 :)