如何在没有会话变量的情况下禁用从Web下载文件?

时间:2016-01-05 23:53:02

标签: php

我现在不想问这个问题,所以可能会重复。让我们看一下:我想禁用从我的网站上下载文件而没有下载脚本(只使用网址:http://something/file.zip),除非您已经注册,最好使用PHP。是的,这是一个非常常见的话题,但我还没有找到任何信息!很多页面都是这样做的,例如uploaded.net。我希望你理解我在说什么。谢谢!

1 个答案:

答案 0 :(得分:0)

首先,不允许直接访问文件。将其存储在Web应用程序的根文件夹的外部,在文件系统的其他位置,以便没有可用于下载它的链接。这是因为直接访问会跳过任何PHP应用程序,并且只与Web服务器进行交互,而Web服务器不了解您的应用程序的会话值。

然后创建一个"下载"用于向用户提供文件的脚本。通常这样的脚本会被赋予文件的一些标识符,例如:

http://yourserver.com/download.php?file=file.zip

重要: 非常小心如何识别该文件。不要盲目地让用户下载他们想要的任何内容,或者他们可以在URL上输入更长的路径并从服务器下载任何文件始终首先验证对事物的访问权。)

这就像任何其他PHP脚本一样,除了它不会显示HTML而是返回文件。输出文件的实际部分可以简单如下:

readfile('/path/to/file.zip');

您也可能希望适当地设置内容标题等。可以找到更完整的示例in the documentation

<?php
$file = 'monkey.gif';

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));
    readfile($file);
    exit;
}
?>