首先我要直接引用这本书
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。我是对的吗?
答案 0 :(得分:0)
是的,你是对的。请参阅basename()
。
显然它不是“书”,它只是“一本书”,我无法对此发表评论,因为我不了解背景。一个简单的实现,不会在代码中改变很多,就是检查是否有一个包含该路径的文件,并且有一个数据库表包含允许下载的文件。还有很多方法需要你改变很多,但它们更好。例如。永远不要将您的src或您的存储库放在pubic_html中,并根据用户权限授予下载权限