构建PHP下载链接


Building PHP Download link

首先我要直接引用这本书

basename()提取路径的filename组件,因此如果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。我说得对吗?

是的,你是对的。参见basename()

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