我正在尝试为登录用户创建安全的文档检索系统。
首先,我检查用户是否已登录。如果是,我将把文件从服务器上的受保护目录复制到用户当前目录中的Web可访问空间。
然后我将它们重定向到文件现在所在的URL。告诉代码要休眠10秒钟以允许慢速连接时间来下载文件,然后将其删除,以便链接不再被其他人使用。
我的问题是在标题之后睡眠功能不起作用。我尝试删除if语句,这使脚本休眠10秒钟,然后取消链接文件,然后重定向用户,使链接已经破坏。
我很难找到让脚本睡眠10秒的方法,并且在重定向发生后仍然执行代码。
<?php
if(!isset($_SESSION['id'])){
header("location:../../../");
}
else {
echo copy('C:\directorypath\test.xls','test.xls');
if(header("location:../docs/test.xls")){
sleep("10");
unlink("test.xls");
}
}
?>
答案 0 :(得分:3)
您尝试做的事实上实际上无法使用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
和serve the file as a proxy。如果未找到哈希值,或者used
列的值不是0
,则会返回错误。
这样我们只能为登录用户提供一次(秘密)文件。