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

log*_*gan 0 php cookies session

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

<a href="myfile.pdf">Download here</a>
Run Code Online (Sandbox Code Playgroud)

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

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

$_SESSION['login'] = 1  or $_COOKIE['login'] = 1
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cal*_*n K 5

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

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

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

编辑:

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

就像是

filedownload.php?filename=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.";
}
?>
Run Code Online (Sandbox Code Playgroud)

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

  • @logan,该脚本应该是整个页面中唯一的内容。没有其他的。`&lt;?php` 前连空格都没有 (3认同)