【发布时间】:2023-03-27 18:15:02
【问题描述】:
我正在尝试使用此脚本删除一个目录及其所有内容...
<?php
$app = $_POST['app'];
if (isset($_POST['app'])) {
$dir = "../apps/" . $app . "/";
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}
}
?>
$post 工作正常,脚本没有返回任何错误,只是没有删除目录。它可能与文件夹权限有关吗?我需要激活任何 PHP 扩展吗?
--编辑--
链接的副本没有做我想要的,我不知道如何更改它的代码。我正在删除客户端的一个目录,所以我不能使用__DIR__,因为它会保留这样的路径 /test/app 并且我需要它们像这样 \test\app 代码也不会删除文件夹但是它确实删除了所有内容。我相信这与FilesystemIterator::SKIP_DOTS 行有关。我还需要代码来删除文件夹,因为当用户再次安装应用程序时,由于文件夹重复,它不会工作。
工作代码:
<?php
$app = $_POST['app'];
if (isset($_POST['app'])) {
$dir ="../apps/" . $app;
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
$file->isDir() ? rmdir($file) : unlink($file);
}
rmdir($dir);
}
?>
【问题讨论】:
-
您确实想在链接的欺骗中使用已接受的答案。它更容易使用。除此之外,您要确保路径确实位于“../apps/”文件夹下方。现在,恶意用户可以使用目录遍历攻击并传入“..”作为导致“../apps/../”的路径,我怀疑你是否希望发生这种情况。
-
嗨@Gordon 感谢您的回复。您能否解释一下
__DIR__在目录路径之前的含义或作用?我刚刚使用了那个代码,我的目录仍然没有被删除 -
我不相信我的问题是重复的@Gordon,请你看看我更新的问题
-
我不确定是否应该重新打开它。你能澄清你在客户端删除目录的意思吗? PHP 在服务器端运行。它无权访问客户端。斜线的方向也无关紧要,因为 PHP 将在内部为您的平台使用正确的格式。另外,您说它确实删除了内容,但只是没有删除顶级文件夹。这很容易解决,只需在迭代器完成删除所有内容后 rmdir'ing 路径。
-
好吧,当我使用
__DIR__时,我遇到了一个错误,它在两个方面都是错误的。首先,它没有考虑 .. 向上一层,因此路径从 php 文件所在的位置开始,其次,它开始的路径以错误的方式斜线到路径的其余部分。我假设迭代器应该在最后“rmdir”目录。我在迭代器的末尾添加了该行,现在一切正常。感谢你的帮助!我会把完整的代码放在我的问题中
标签: php directory scandir rmdir