为什么exec(escapeshellcmd("rm -rf/var/www/temp/storage/$ userId /"))在php文件在后台运行时删除父目录?

use*_*637 0 php

我有以下两个PHP脚本

remove_directory.php

<?php
start_session();
$userId = $_SESSION['userId'];
exec(escapeshellcmd("rm -rf /var/www/temp/storage/$userId/"));
?>
Run Code Online (Sandbox Code Playgroud)

indirectly_remove_directory.php

<?php
start_session();
exec("nohup php remove_directory.php > /var/www/temp/log.txt &"); 
?>
Run Code Online (Sandbox Code Playgroud)

当我remove_directory.php从cgi 运行时,它按预期工作,递归删除/var/www/temp/storage/$userId/但是当我indirectly_remove_directory.php从cgi 运行时,它不能按预期工作,因为它递归删除/var/www/temp/storage/.

为什么我运行时会删除整个存储目录indirectly_remove_directory.php

Mar*_*c B 7

因为当它在后台时,它是一个命令行PHP脚本,它不会提供内部服务器版本所具有的会话cookie.因此,您将获得一个全新的CLEAN会话,这意味着您的exec调用实际上是:

rm -rf /var/www/temp/storage//
Run Code Online (Sandbox Code Playgroud)

因为$ userID为空/空.