readfile() - 仅允许从某些目录下载某些文件类型

时间:2011-03-24 15:09:17

标签: php security readfile

我在我正在创建的网站上有文件夹,我只希望登录用户能够访问这些文件。所以,我决定使用一些.htaccess规则和PHP文件处理程序,这样我就可以确保用户在访问文件之前就已登录了。文件处理程序将以“/download.php?file=filename.pdf”的形式获取输入。我只希望用户能够下载Word文档和PDF文件。我如何制作它以便用户不能通过下载我网站的.php文件或下载这些目录之外的文件来滥用我的文件处理程序?

3 个答案:

答案 0 :(得分:0)

在提供要下载的文件之前清理该值。检查它是否为父遍历并验证文件扩展名。

答案 1 :(得分:0)

例如,不要直接公开正在下载的文件的名称。使用某种散列令牌。理想情况下,您将保留数据库中所有可能文件的列表,并使用记录主键的salted +哈希副本作为文件的客户端标识符。而不是

/download.php?filename=my_bank_password.txt

用户将看到

/download.php?id=235gdlhs987234rljfser23j8233r4

代替。

在download.php脚本中,你做了相应的检查 - 这个人是否被清除以查看文件,是否允许他们下载此文件类型等等...如果他们不是,则输出错误页面。如果是,你输出文件,使用适当的标题,这样他们就可以获得原始文件名,而不是散列的杂文或“download.php”

答案 2 :(得分:0)

嗯,我要注意到这可能是不安全的。尽管如此,这是一种常见的程序类型。文件处理程序应清理用户输入。首先,您应该在功能有限的单独帐户上运行Web服务器。这样,如果黑客可以尝试访问您的文件系统,那么它们已经受到严重限制。然后,您应该更改下载文件夹之外的所有内容的权限。

现在,您有几个选项可以清除要下载文件的用户输入。

您可以使用Perl Regex查找扩展名。

您可以使用pathinfo()来获取基本名称和扩展名......这样您就不会打开任何目录(例如../或/ home等)。

您可以在数据库中为每个文件指定一个id,然后让文件处理程序执行类似/download.php?file=12345的操作,但您必须清除数据库的用户输入。

相关问题