我正在尝试为登录用户创建一个安全的文档检索系统。
首先,我检查用户是否已登录。如果他们是,我会将文件从服务器上的受保护目录复制到用户当前目录中的 Web 可访问空间。
然后,我将它们重定向到文件现在所在的 URL。告诉代码休眠 10 秒,以允许慢速连接时间下载文件,然后删除它,以便其他人不再使用该链接。
我的问题是在标题之后睡眠功能不起作用。我尝试删除 if 语句,这使脚本休眠 10 秒,然后在重定向用户之前取消链接文件,以便链接已经断开。
我正在努力找到一种方法让脚本休眠 10 秒,并在重定向发生后仍然执行代码。
<?php
if(!isset($_SESSION['id'])){
header("location:../../../");
}
else {
echo copy('C:directorypathtest.xls','test.xls');
if(header("location:../docs/test.xls")){
sleep("10");
unlink("test.xls");
}
}
?>
你试图做的事情实际上不可能用PHP做,因为PHP是单线程的,并且从头到尾执行每个请求。这意味着在脚本中的所有代码完成之前,不会完成header
重定向。这意味着脚本将首先等待,然后删除文件,然后尝试重定向到非退出文件。
相反,我打算采用另一种方法;使用和存储只能使用一次的唯一哈希。
检查用户是否已登录。如果他或她已登录,则生成一个唯一的哈希并将其插入数据库,例如INSERT INTO hashes (hash, used) VALUES ($myUniqueHash, 0)
.然后将用户重定向到请求查询中带有哈希的 PHP 文件,例如
header("Location: serve_file.php?hash=$myUniqueHash");
此文件将根据包含哈希的表检查$_GET['hash']
的值,并检查used
的值是否0
。如果是这种情况,它将更新used
列以1
并将文件作为代理提供。如果未找到哈希,或者used
列的值未0
它将返回错误。
这样,我们只能为登录用户提供一次(秘密)文件。