【问题标题】:listing a folder content : how to prevent user from going above the authorized directory?列出文件夹内容:如何防止用户超出授权目录?
【发布时间】:2009-08-26 08:37:32
【问题描述】:

我正在编写一个脚本以允许用户浏览给定目录,该目录不是该文件所在的目录,而是设置在一个变量中。

 define('FOLDER', '../_files/');

现在,渲染的 html 允许导航该文件夹内的子文件夹。我使用“dir”GET 变量告诉我的脚本要显示哪个子文件夹的内容,并使用“..”链接允许向上,使用相同的 dir 变量。

我设置了一个检查,如果 $_GET['dir'] 等于 FOLDER,它不应该显示那个“..”链接。但是很容易弄乱 url 中的那个变量,无论我做什么,我的脚本都允许在授权文件夹上方浏览。不完全是安全的情况...

所以我想我应该根据请求的目录检查授权目录的完整本地路径,如果后者不在授权目录中,则不显示“..”。

但我不知道该怎么做。任何提示或指针将不胜感激。谢谢

【问题讨论】:

标签: php tree directory-listing


【解决方案1】:

你可能想看看realpath()

$foo = realpath($foo);
if (substr($foo, 0, 8) != '/my/path') {
    return false;
}

...或类似的东西。

复制自this answer,因为我认为这个问题更好。

【讨论】:

  • 谢谢。 $foo 是请求的目录,而 /my/path/ 是授权目录,对吧?
【解决方案2】:

或者你可以使用正则表达式

$requested = realpath($foo);
$allowedpath = '/path/to/allowed';

$regex = '/^'.addslashes($allowedpath).'\/?.*$/';

if (!preg_match($regex, $requested)) {
    return false;
}

【讨论】:

  • 你应该使用 preg_quote() 而不是 addlashes()。
  • preg_quote() 不会替换我的斜杠,因为正则表达式的开始和结束字符几乎可以是任何东西,但您可以将其另外添加到addslashes()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多