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

php仅在会话/cookie处于活动状态时才允许下载,php,session,cookies,Php,Session,Cookies,我在我的网站上提供了一个直接的下载链接,如下所示 <a href="myfile.pdf">Download here</a> $_SESSION['login'] = 1 or $_COOKIE['login'] = 1 即使设置了以下条件,人们也可以手动键入并下载文件… if($_SESSION['login']===1 && $_COOKIE['login']===1){ echo '<a href="myfile.pdf">

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

<a href="myfile.pdf">Download here</a>
$_SESSION['login'] = 1  or $_COOKIE['login'] = 1
即使设置了以下条件,人们也可以手动键入并下载文件…

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

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

如果是我,我会使用类似的方法对未登录的用户完全隐藏链接

if($_SESSION['login']===1 && $_COOKIE['login']===1){
    echo '<a href="myfile.pdf">Download here</a>';
}
if($_SESSION['login']===1 || $_COOKIE['login']===1){
    echo '<a href="myfile.pdf">Download here</a>';
}
if($\u会话['login']==1 |$\u COOKIE['login']==1){
回声';
}
如果在单击链接后根据会话查找特定的下载,则必须设置某种类型的脚本来处理上述代码并返回所需的文件

编辑:

好的,然后将其链接到一个脚本,该脚本从不可访问的位置检索文件,并使用相同的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.";
}
?>


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

如果是我,我会使用类似的方法对未登录的用户完全隐藏链接

if($_SESSION['login']===1 || $_COOKIE['login']===1){
    echo '<a href="myfile.pdf">Download here</a>';
}
if($\u会话['login']==1 |$\u COOKIE['login']==1){
回声';
}
如果在单击链接后根据会话查找特定的下载,则必须设置某种类型的脚本来处理上述代码并返回所需的文件

编辑:

好的,然后将其链接到一个脚本,该脚本从不可访问的位置检索文件,并使用相同的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.";
}
?>



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

使用if语句检查会话/cookie并相应输出创建一个php脚本,用于检查会话变量、读取文件并发送强制下载头。关于如何做到这一点,有上千篇文章。@ElefantPhace:即使设置了,任何人都可以手动键入链接并获取文件如果他们知道文件名,是的,当你单击链接时,它会转到文件的php脚本,如果下载得到授权,就会弹出一个下载对话框。用户不会将下一个屏幕视为页面。它们自动保持在同一页上。使用if语句检查会话/cookie并相应地输出创建一个php脚本,该脚本检查会话变量,读取文件并发送强制下载头。关于如何做到这一点,有上千篇文章。@ElefantPhace:即使设置了,任何人都可以手动键入链接并获取文件如果他们知道文件名,是的,当你单击链接时,它会转到文件的php脚本,如果下载得到授权,就会弹出一个下载对话框。用户不会将下一个屏幕视为页面。它们会自动保留在同一页上。即使设置了链接,任何人都可以手动键入链接并获取其显示的文件,警告:无法修改标题信息-标题已存在sent@logan,该脚本应该是整个页面中唯一的内容。没有别的了。在
之前连一个空格都没有,那么您的脚本肯定有其他问题。这将检查会话和cookie是否已设置。如果是,则下载文件;如果不是,则显示错误消息。确保使用了会话_start();在filedownload.php文件上。您可能希望在另一个脚本上显示文本,并使用诸如元刷新或javascript之类的内容将用户转发到下载页面。您不能在与下载脚本相同的页面上显示消息,因为标头之前的任何输出都将引发错误,标头之后的任何输出都将包含在下载的文件中。即使设置了此选项,任何人都可以手动键入链接并获取所显示的文件,警告:无法修改标头信息-标头已存在sent@logan,该脚本应该是整个页面中唯一的内容。没有别的了。在
之前连一个空格都没有,那么您的脚本肯定有其他问题。这将检查会话和cookie是否已设置。如果是,则下载文件;如果不是,则显示错误消息。确保使用了会话_start();在filedownload.php文件上。您可能希望在另一个脚本上显示文本,并使用诸如元刷新或javascript之类的内容将用户转发到下载页面。您不能在与下载脚本相同的页面上显示消息,因为头之前的任何输出都将抛出错误,头之后的任何输出都将包含在下载的文件中。