php - PHP 中受密码保护的目录和文件

标签 php security

我正在创建一个简单的私有(private)页面,其中包含一些要下载的文件的链接。我已经通过简单的 session 管理完成了它,但我遇到了一个问题:如果有人单击文件 url,他可以在没有身份验证的情况下下载文件。那么我能做些什么来避免这种情况呢?我可以进行 HTTP 身份验证,但我想要自定义登录表单而不是弹出窗口。

有什么想法吗?

谢谢

最佳答案

我想现在回答有点晚了。无论如何,它可能会帮助其他人。

要保护文件不被直接下载,您必须结合使用 PHP + .htaccess。

让我们承认 ./downloads/是您存储要下载的文件的文件夹。 首先,您已将 .htaccess 放入此文件夹中。

.htaccess 在 ./downloads/中:

deny from all

这将为每个人保护文件夹,除了在服务器端执行的脚本。


这是您可以在根目录中编写的 PHP 脚本示例。/

./中的 index.php:

<?php
    if(!empty($_GET["filename"]))
    {
        //Here is the path to the folder containing files to download
        $my_download_folder = "./downloads/";

        //Preparing headers
        header("Content-type: application/force-download"); 
        //You can use more headers :
        //header("Content-Length: ".filesize($my_download_folder . $_GET["filename"]));
        //header("Content-Disposition: attachment; filename=".basename($my_download_folder . $_GET["filename"]));

        //You can check if the file does exist
        //if (!file_exists($my_download_folder . $_GET["filename"])) 
        //exit(); 

        //Reading file will trigger download on the browser side
        readfile($my_download_folder . $_GET["filename"]);
    }
?>

<html>
    <form action="" method="GET">
        <input type="text" name="filename" id="filename" />
        <input type="submit" value="Download It !" />
    </form>
</html>

这个脚本可以直接使用。不过要小心。实际上存在一个重大漏洞: 使用此表单,您可以下载服务器的任何文件(包括像 config.php 这样包含对数据库的访问权限的文件)。 要修复该漏洞,您可以使用 ID:

if ($_GET["id"] == 1)
    $filename = "toto.pdf"
if ($_GET["id"] == 2)
    $filename = "fish.png"



它提供了一个保护文件不被直接下载但不被 PHP 下载的好例子。

关于php - PHP 中受密码保护的目录和文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3166792/

相关文章:

php - MySQL,如何使用返回的数据?

security - 谷歌应用引擎的 ssl 是免费的吗?

node.js - 从 node.js 应用程序中将字符串安全地存储在内存中

php - 对 up 目录使用 require_once 不起作用

php - 如何在 laravel 中使用 required_unless

java - 单点登录无法在 Jboss 上运行

api - REST API : Simple token-based authentication - security?

c# - WCF 最容易实现的安全模式

javascript - 调用未定义的方法 Illuminate\Http\RedirectResponse::validate()

php - jQuery/PHP POST 不工作