我正在创建的网站上有文件夹,我只希望登录用户能够从中访问文件。所以,我决定使用一些 .htaccess 规则和一个 PHP 文件处理程序,这样我就可以确保用户在访问文件之前已经登录。文件处理程序将以“/download.php?file=filename.pdf”的形式接受输入。我只希望用户能够下载 Word 文档和 PDF 文件。我该如何做到这一点,以便用户不能通过为我的网站下载 .php 文件或下载这些目录之外的文件来滥用我的文件处理程序?
3 回答
好吧,我要指出这样做可能不安全。尽管如此,它是一种常见的程序类型。文件处理程序应该清理用户输入。首先,您应该在能力有限的单独帐户上运行您的 Web 服务器。这样,如果黑客可以尝试访问您的文件系统,他们已经受到严重限制。然后,您应该更改下载文件夹之外的所有内容的权限。
现在,您有几个选项可以清理要下载的文件的用户输入。
您可以使用 Perl Regex 来查找扩展名。
您可以使用 pathinfo() 获取基本名称和扩展名...这样您就不会打开任何目录(如 ../ 或 /home 等)。
您可以在数据库中为每个文件指定一个 id,然后让文件处理程序执行类似 /download.php?file=12345 的操作,但您必须清理数据库的用户输入。
在提供文件供下载之前清理值。检查它的父遍历并验证文件扩展名。
一方面,不要直接暴露正在下载的文件的名称。使用某种散列标记。理想情况下,您会保留数据库中所有可能文件的列表,并使用记录主键的盐分+散列副本作为文件的客户端标识符。所以而不是
/download.php?filename=my_bank_password.txt
用户将看到
/download.php?id=235gdlhs987234rljfser23j8233r4
反而。
在 download.php 脚本中,您进行适当的检查 - 此人是否可以查看该文件,是否允许他们下载此文件类型等...如果不允许,则输出错误页面。如果是,则输出带有适当标题的文件,这样他们将获得原始文件名,而不是散列垃圾或“download.php”