PHP scandir看到旧的已删除文件,fopen查看其内容

时间:2018-06-15 22:33:49

标签: php bash file

我在一些PHP代码中遇到了一个非常奇怪的异常,我需要一些帮助来弄清楚这里发生了什么。

用户有一个文件目录,PHP将所有文件的名称和内容中继到网页。

它会检测scandir的文件并使用fopen读取它们。

另一个PHP文件能够通过unlink删除这些文件,这是通过JavaScript AJAX请求调用的。

在测试过程中,我创建了一个名为_.txt的文件,后来将其与上述unlink文件一起删除。

这是事情变得非常奇怪的地方。

在我的工作区的文件浏览器中,_.txt文件已消失。

在Bash终端中使用ls表示_.txt文件已消失。

但是PHP scandir仍然检测到该文件,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已不存在。

     

我正在尝试做的是成功摆脱此文件并防止再次发生这种情况。

我一直在寻找解决方案的所在地,找不到一个,所以我在这里寻求帮助。感谢您花时间来帮助解决这个问题。

0 个答案:

没有答案