在标头之后延迟取消链接



我正在尝试为登录用户创建一个安全的文档检索系统。

首先,我检查用户是否已登录。如果他们是,我会将文件从服务器上的受保护目录复制到用户当前目录中的 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它将返回错误。

这样,我们只能为登录用户提供一次(秘密)文件。

最新更新