【问题标题】:htaccess Authentication with PHP使用 PHP 进行 htaccess 身份验证
【发布时间】:2009-04-27 07:31:02
【问题描述】:

在我正在处理的当前网站上,我有一个文件目录供用户下载,如果有一些安全方法而不是晦涩难懂,那真是太好了;)

我想知道是否有任何方法可以通过 PHP 向 htaccess 提供登录信息,就像用户正在输入它一样。

另外,如果有人知道使用 PHP 保护用户下载的更好方法,那也是可以接受的。我所有的谷歌搜索都显示“只使用 htaccess”,这并没有真正的帮助,因为从非精通用户的角度来看,他们每次使用该网站时都必须登录两次。

我最好的猜测是只使用 PHP 将文件存储在 web 根目录之上,然后将它们临时复制到 web 可访问文件夹,但这似乎效率很低,我想不出任何方法来删除它们之后下载完成。

注意:我不拥有正在运行的服务器,也没有 ssh 访问权限。

【问题讨论】:

    标签: php security .htaccess


    【解决方案1】:

    如果文件不是太大 (Gb),您可以随时使用readfile 下载文件。在这种模式下,您可以检查用户之前的身份验证,如果可以,则将文件内容输出给用户,否则将他发送到登录页面。

    使用这种方法,您可以将文件放在受保护的(使用 .htaccess)目录中,这样您就可以确保未经身份验证的任何人都无法访问它们。

    【讨论】:

    • PHP 文档中给出的示例特别有用。谢谢。
    • 更好 - 将文件放在网络服务器的根目录下,因此您无需担心使用 .htaccess 保护目录。
    • readfile 不是一个好主意。您必须设置正确的标头,并且 readfile 不支持 http“范围”。这意味着您踢出所有下载管理器。无法恢复下载。
    • @Bernd Ott - 这对我来说很好,因为没有文件会超过 20MB,如果接近这个​​限制,我会感到惊讶,PHP 文档页面上也会显示正确的标题,这似乎工作正常。
    • 根据您的连接,20 MB 可能真的很大。标题取决于文件!确保你总是可以制作一个假的 mime 类型,它总是下载(如 application/x-download)
    【解决方案2】:

    我想我要么将它们存储在 web 根目录之外的文件夹中,要么将它们存储在受 .htaccess 保护的文件夹中,然后使用 php 脚本检查用户是否已登录并允许下载请求的文件。如果他是,那么只需pass the file through 给用户。

    来自 php.net 链接页面的示例:

    示例 #1 使用 fpassthru() 处理二进制文件

    <?php
    
    // open the file in a binary mode
    $name = './img/ok.png';
    $fp = fopen($name, 'rb');
    
    // send the right headers
    header("Content-Type: image/png");
    header("Content-Length: " . filesize($name));
    
    // dump the picture and stop the script
    fpassthru($fp);
    exit;
    
    ?>
    

    其他人评论说必须报告正确的内容类型,这是真的。通常,根据我自己的经验,我已经知道它,或者可以很容易地使用文件扩展名。否则,您可以随时尝试查看finfo_file。在那个页面上,还有一些关于你可以做什么特别是图像的 cmets。

    【讨论】:

      【解决方案3】:

      您应该使用 php 脚本来控制访问。 在 webroot 外部或 webroot 内部创建一个 .htaccess 目录,您可以在其中放置下载文件。

      网站根目录更好。

      如果这些文件位于其中,您必须确保没有人可以访问这些文件。

      然后从 pear 类库中获取。 http_download 类。

      使用这个类有很多好处。

      • 范围(部分下载和恢复)
      • 基本缓存功能
      • 基本节流机制
      • 即时 gzip 压缩
      • 通过 Archive_Tar 和 Archive_Zip 交付即时生成的档案
      • 发送 PgSQL LOB 无需在发送前读取所有数据

      您不应使用 readfile 或任何转发文件指针,因为您必须自己设置标头并且不支持 http“范围”。

      对于访问限制,您可以使用会话管理器、密码、框架、论坛等。

      pear - http_download http://pear.php.net/package/HTTP_Download

      您需要复制 url,因为 SO 将其编码为 url 编码的字符串(这是正确的),但 PEAR-homepage 不喜欢这样。

      【讨论】:

      • 错误 404 - 找不到文档
      • 下划线由 SO 编码。再次将编码值替换为 uscore。梨主页不喜欢编码的网址。
      【解决方案4】:

      为什么要重新发明轮子?看看File Thingy,它很容易安装和定制。如果不出意外,您可以研究源代码以了解如何执行身份验证步骤。

      【讨论】:

      • 我可能很容易被淘汰,但在我看来,这只会验证该页面。我需要防止人们只是输入文件名并下载它。
      • 你可以完全像那样配置它。见solitude.dk/filethingie/documentation/install
      • 大声笑我只是把文件放在一个应用程序中。虽然它只是写入 webroot 之外的文件夹。它实际上无法下载这些文件。这就是为什么我实际上在看这个问题......
      【解决方案5】:
      1. 在我看来,您可以使用 MySQL 来存储上传的文件,而不是将它们存储在文件中,这样会更好、更安全。以谷歌“MySQL 上传 php”为例。
      2. 您可以使用 PHP 脚本从您的用户表中创建 htaccess 文件,每次用户访问该文件夹时,非常麻烦。

      我认为第一个选项更好。

      【讨论】:

        【解决方案6】:

        使用X-SendFile!有适用于 Apache、Lighty 和 Nginx 的扩展,因此很有可能有一个适用于您的网络服务器。

        安装扩展后,您可以使用 PHP 脚本对用户进行身份验证,然后添加标头:

        header('X-SendFile','/path/to/file');
        

        当您的 PHP 脚本完成后,它将触发网络服务器为您流式传输文件。如果您将 PHP 与 FastCGI 一起使用,这将特别有效,因为它可以释放 PHP 进程以进行其他工作。

        永远

        【讨论】:

        • 我不拥有服务器,无法在该级别对其进行更改。
        猜你喜欢
        • 2011-12-27
        • 2011-04-25
        • 2018-06-30
        • 2011-11-12
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        相关资源
        最近更新 更多