构建PHP下载链接

时间:2016-01-09 13:07:09

标签: php

首先我要直接引用这本书

  

basename()提取路径的文件名组件,如果是   basename($ _ GET ['file'])与$ _GET ['file']不同,你知道有一次尝试   探测你的服务器。

假设我有这个下载链接。

<a href="download.php?file=image.jpeg">Click here to download image</a>

在download.php文件中,我有这行代码:

if (isset($_GET['file']) && basename($_GET['file']) == $_GET['file']) {
    // do something with the file
}

如果我更改链接中的文件查询(来自浏览器的地址栏),比如说,我将其更改为:

download.php?file=passwords.txt

从我可以从download.php中的条件行中读到的内容,它不会对文件查询链接的检查产生影响,条件可以理解为:

isset($_GET['file']) // This evaluates to TRUE because now it contains passwords.txt
basename($_GET['file']) // This will contain passwords.txt
$_GET['file'] // This will contain passwords.txt

这是否意味着使用download.php中的条件阻止用户从浏览器注入恶意查询的尝试是错误的?至少使用书中的代码。

我可以使用数组来存储用户可以安全下载的有效文件,并使用in_array()函数进行检查。还是我读错了代码?

基本上我在这里要说的是,如果你在链接中更改文件查询,则download.php中的条件总是计算为true。我是对的吗?

1 个答案:

答案 0 :(得分:0)

是的,你是对的。请参阅basename()

显然它不是“书”,它只是“一本书”,我无法对此发表评论,因为我不了解背景。一个简单的实现,不会在代码中改变很多,就是检查是否有一个包含该路径的文件,并且有一个数据库表包含允许下载的文件。还有很多方法需要你改变很多,但它们更好。例如。永远不要将您的src或您的存储库放在pubic_html中,并根据用户权限授予下载权限