使用PHP,我正在开发一个脚本,一旦验证了脚本,就会生成合同。
合同是使用TCPDF生成的pdf文档,我将其保存到具有用户ID的子目录中的服务器上。例如,'contracts / 132 / 1.pdf'将是ID为132的用户的账单#1。
但是,我只希望用户132能够访问该文件,因为它包含个人信息。如何限制每个子文件夹中pdf文档对各自用户的访问权限(使用php或htaccess,哪个效果最好 - 我对htaccess不是很熟悉)?
答案 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地址的请求。 :)