确保在PHP中用户定义的路径是安全的。

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;
        }
    }
}

这样做足以确保用户发送的路径是安全的吗?还是说我需要采取其他措施来防止攻击?


1
您在foreach()中反转了变量。 - Greg
谢谢您注意到这一点... - user47322
1个回答

8

也许realpath()对你有所帮助。

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

但是,请注意此函数假设输入路径实际存在。它将不会对不存在的路径执行规范化操作。在这种情况下,返回FALSE。


所以我在传递的路径上执行realpath(),然后检查它是否在我的“安全”目录下面? - user47322
没错。由于你会得到一个直截了当的路径返回(或FALSE),所以你可以进行简单的子字符串比较作为检查。 - Tomalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接