检查文件夹中是否存在文件

Zer*_*f3r 5 php file-exists

我的剧本:

$secret = check_input($_GET['secret']);
if(isset($_POST['register'])) {
    if (isset($secret) || !empty($secret)) {
        if (file_exists(ROOT . '/intl/codes/' . $secret)) {
            unlink(ROOT . '/intl/codes/' . $secret);
            $trusted = 'yes';
        } else {
            $trusted = 'no';
        }
    }
//$_POST['register'] register details...
}
Run Code Online (Sandbox Code Playgroud)
  1. 还有另一种方法(简化等)吗?
  2. 如果文件夹$secret中不存在/codes/,它会产生Warning: unlink Is a directory如何摆脱它?
  3. 即使文件不存在,为什么$trusted总是给出yes

Bai*_*ker 6

要删除目录,您应该使用rmdir()而不是unlink().

$secret = check_input($_GET['secret']);
if(isset($_POST['register'])) {
    if (!empty($secret)) {
        if(file_exists(ROOT . '/intl/codes/' . $secret)) {
            rmdir(ROOT . '/intl/codes/' . $secret);
            $trusted = 'yes';
        } else {
            $trusted = 'no';
        }
    }
    //$_POST['register'] register details...
}
Run Code Online (Sandbox Code Playgroud)

虽然,这里存在严重的安全风险!如果您check_input()没有正确清理$secret,可能rmdir('/intl/codes/../')与删除/ intl /相同.尝试这样的事情:

$allowed = ROOT. '/intl/codes/';
$path = realpath($allowed . check_input($_GET['secret']));

if(strpos($path, $allowed) === 0) {  //Check that $path is within allowed directory
    if(is_dir($path)) {
        rmdir($path);
    } else if(file_exists($path)) {
        unlink($path);
    } else {
        echo "File/folder not found";
    }
} else {
    echo "Untrusted user tried to delete outside of allowed directory";
}
Run Code Online (Sandbox Code Playgroud)