我在一些PHP代码中遇到了一个非常奇怪的异常,我需要一些帮助来弄清楚这里发生了什么。
用户有一个文件目录,PHP 将所有文件的名称和内容中继到网页。
它使用scandir
检测文件并使用fopen
读取它们。
另一个PHP文件能够通过unlink
删除这些文件,这是通过JavaScript AJAX请求调用的。
在测试过程中,我创建了一个名为_.txt
的文件,后来使用上面提到的unlink
文件将其删除。
这就是事情变得非常奇怪的地方。
在我的工作区的文件浏览器中,_.txt
文件不见了。
在 Bash 终端中使用ls
表示_.txt
文件已消失。
但是 PHPscandir
仍然检测到该文件,并且fopen
能够成功读取其内容。
从这一点开始,我通过 Bash 终端创建了一个带有touch _.txt
我给了它一些内容nano _.txt
PHP 会正确检测该文件并读取新_.txt
文件的内容。
然后我用rm _.txt
删除了它
现在 PHP 仍然检测_.txt
文件,并且仍然读取旧_.txt
文件的内容。
为了使这个问题更加奇怪,我通过这些PHP命令创建和删除的任何其他文件都不会发生这种情况。_.txt
,只有这一个文件给我带来了所有这些麻烦。
自从这种情况开始发生以来,我已经重新启动了服务器几次。
我在网上看遍了,找不到任何关于这个的信息。
负责扫描和读取文件的代码片段:
$username = $_COOKIE['username'];
/*
password checks ommited as it's not relevant
*/
$directory = scandir('USERFILES/'.$username);
foreach($directory as $filename){
// do not select . and ..
if($filename != '.' && $filename != '..'){
// by default this remains an empty string
$fileusesunderscore = '';
// if invalid characters start the filename
if(strpos('0123456789.,-[]/+=\`"'!*:|@#%^&()<>?|;~', $filename[0]) !== false){
// set the empty string to underscore
$fileusesunderscore = '_';
}
// grab the file contents
$file = fopen('USERFILES/'.$username.'/'.$filename, 'r');
/*
line at this position is responsible for echo'ing the file
it is ommited as it is irrelevant, except that $fileusesunderscore is used like so when echoing:
$fileusesunderscore.pathinfo($filename, PATHINFO_FILENAME)
*/
fclose($file);
}
}
负责删除文件的代码片段:
$username = $_COOKIE['username'];
// filename can only possibly equal a name that was
// given to the JS by the first PHP file
$filename = $_POST['file'];
/*
password checks ommited as it's not relevant
*/
$filepath = '/USERFILES/'.$username.'/'.$filename.'.txt';
unlink(getcwd().$filepath);
所以我想总结一下,这是我遇到的问题,需要帮助来实现:
名为
_.txt
的文件已通过unlink
删除,不再存在。
scandir
仍然看到它,fopen
仍然看到它的内容。我无法使用 Bash
rm
删除文件_.txt
因为它不再存在。我正在尝试做的是成功摆脱此文件并防止这种情况再次发生。
我一直在到处寻找解决方案,但找不到,所以我在这里寻求帮助。感谢您抽出宝贵时间对此提供帮助。
旧帖子,但我在我的 Kali Linux 上遇到了类似的问题。疯了几个小时! 通过以 root 身份进入目录(视觉上不存在的文件(来解决,在命令行中尝试使用 dir 命令作为最后的想法,然后删除的文件显示为"name.jpg~"。 使用 rm 命令删除了它们,一切都很好!