7

我正在用 PHP 实现一个简单的目录列表脚本。

我想确保在打开目录句柄并echo随意获取结果之前传递的路径是安全的。

$f = $_GET["f"];
if(! $f) {
    $f = "/";
}
// make sure $f is safe
$farr = explode("/",$f);
$unsafe = false;
foreach($farr as $farre) {
    // protect against directory traversal
    if(strpos($farre,"..") != false) {
        $unsafe = true;
        break;
    }
    if(end($farr) != $farre) {
        // make sure no dots are present (except after the last slash in the file path)
        if(strpos($farre,".") != false) {
            $unsafe = true;
            break;
        }
    }
}

这足以确保用户发送的路径是安全的,还是我应该做其他事情来防止攻击?

4

1 回答 1

8

这可能realpath()对您有帮助。

realpath()展开所有符号链接并解析对 的引用和输入路径中的额外字符'/./', 并返回规范化的绝对​​路径名。'/../''/'

但是,此函数假定所讨论的路径确实存在。它不会对不存在的路径执行规范化。在这种情况下,返回 FALSE。

于 2009-05-11T09:21:36.773 回答