php仅允许在会话/ cookie处于活动状态时下载

时间:2014-02-12 18:11:43

标签: php session cookies

我在我的网站上提供了一个直接下载链接,如下所示。

<a href="myfile.pdf">Download here</a>

每个人都可以访问此文件。但我想根据登录用户限制这一点。

假设用户在成功登录后拥有活动的会话/ cookie,如下所示。

$_SESSION['login'] = 1  or $_COOKIE['login'] = 1

即使设置了以下条件,人们也可以手动输入http://web.com/myfile.pdf并能够下载文件...

if($_SESSION['login']===1 && $_COOKIE['login']===1){
    echo '<a href="myfile.pdf">Download here</a>';
}

其他匿名用户无法访问该文件。

1 个答案:

答案 0 :(得分:4)

如果是我,我会使用这样的东西来完全隐藏未登录用户的链接

if($_SESSION['login']===1 || $_COOKIE['login']===1){
    echo '<a href="myfile.pdf">Download here</a>';
}

如果您在单击链接后根据会话寻找特定的下载拒绝,则必须设置某种类型的脚本来处理上述代码并返回所需的文件。

编辑:

好的,然后将其链接到一个脚本,该脚本从不可访问的位置检索文件,并使用相同的if / then语句将其反馈回来。

这样的东西

filedownload.php?文件名= foo.bar

然后filedownload.php看起来像这样。

<?php
session_start();
if($_SESSION['login']===1 && $_COOKIE['login']===1){

$file_dir = "/some/dir/";
$file = $file_dir . 'foo.bar';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
} else {
    echo "You need to login to download this file.";
}
?>

这是直接从PHP手册中复制的。并添加了if / then语句。