我的剧本:
$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)
$secret中不存在/codes/,它会产生Warning: unlink Is a directory如何摆脱它?$trusted总是给出yes?要删除目录,您应该使用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)