$datadir = './cache/attesavefile/';
$dbfile = '/a/b/c/d/242423.jpg'; // 这个路径通常在数据库,
unlink($datadir.$dbfile); // 删除之.
# 假如dbfile变量转化如下, 那问题就严重了.
$dbfile = '../../..//d/242423.jpg'; // 往上走了几层,
$dbfile = '/a/b/c/d/./../../index/index.php?242423.jpg'; // 被改变的文件名, 文件名成路径.
// 只要细心, 用户就可以伪装出各类路径来删除你的核心文件. 或者你会说, 数据库不可能保存进这种路径. 的确很少碰到, discuz的文件名是md5过滤的, 路径都是后期固定的, 但许多个人blog, 如wordpress, 附件路径就是保存在数据库. 这时你就应该担心这种bug的发生. 既然删除文件会有这问题, 那可想而知, rmdir也会有此问题.
$dirpath = './images/';
rmdir($datadir.$dirpath);
# 假如$dirpath变量转化如下,
$dirpath = './../../include/'; //上两层的include目录删除.
追究其发生的原因, 重点在于..号在路径中为上一层的意思, 这就让用户可以虚拟出任何的路径出来, 后果非常严重.
我们能够把 '.' 号过滤掉吧? 事实上是不可以的, dir.images 是个合格的目录命名. 你或者会说, 没有人会把这种非法的路径保存进数据库. 不会发生这种bug.
可或许我们应该想想, 假如它发生了, 你将如何来解决之?
// 原本是删除 ./a.images/目录结果.
$dirpath = './../../a.images/';
rmdir($datadir.$dirpath);
或许你能够帮我解决这个问题, 如何判断呢?