提问人:Mark 提问时间:9/9/2023 最后编辑:Mark 更新时间:9/9/2023 访问量:26
PHP exec date -s 运行良好,但不更新日期时间
PHP exec date -s runs fine but does not update datetime
问:
这是我的简单PHP文件:
<?php
if (strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {
if (isset($_POST['datetime'])) {
$datetime = htmlspecialchars($_POST['datetime']);
$datetime[10] = ' ';
$datetime = substr($datetime, 0, 19);
die (json_encode(exec('date -s' . escapeshellarg($datetime))));
}
}
以下是发送数据的 JavaScript 代码段:
function syncTime() {
let data = new FormData();
data.set("datetime", new Date().toISOString());
fetch("datetime.php", {
method: 'POST',
body: data
})
.then(response => response.json())
.then(json => console.log(json));
.catch(err => console.log('Request Failed', err));
}
发送的内容是这样的:
2023-09-08T20:49:28.696Z
清理后如下所示:$datetime
2023-09-08 20:49:28
因此,执行的命令是:
date -s "2023-09-08 20:49:28"
该命令已成功执行,因为我收到返回的输出:
Fri Sep 8 20:49:28 UTC 2023
但是检查服务器上的实际情况会发现该命令实际上并未执行:date
# date
Thu Jan 1 08:34:07 UTC 1970
但是,如果我在上面手动输入相同的命令,它就可以工作:
# date -s "2023-09-08 20:49:28"
Fri Sep 8 20:49:28 UTC 2023
# date
Fri Sep 8 20:49:28 UTC 2023
这是怎么回事?
我正在为 Raspberry Pi 3 开发 Linux,并以 root 身份运行。apache2
答:
2赞
Alex Howansky
9/9/2023
#1
该命令已成功执行,因为我收到返回的输出:
Fri Sep 8 20:49:28 UTC 2023
这不一定是真的。不能根据输出确定成功。如果检查命令的退出状态(通过作为参数传递给 ),您可能会发现它不为零(表示错误)。$result_code
exec()
apache2 以 root 身份运行
这几乎可以肯定不是真的。它以 www-data 或其他非私有用户身份运行。因此,当它执行脚本时,它没有设置时钟的权限。但是,在这种情况下,该命令仍会输出日期,这就是您所看到的日期。如果你也要捕获 stderr,你会得到:date
date: cannot set date: Operation not permitted
Fri Sep 8 08:49:28 PM EDT 2023
评论
0赞
Mark
9/9/2023
是 .我认为以 root 身份运行,因为:返回和返回$result_code
0
# apachectl
httpd (pid 289) already running
# ps | grep 289
289 root /usr/bin/httpd -k start
0赞
Mark
9/9/2023
顺便说一句,我正在使用 Buildroot 环境。不是 Raspbian 或类似产品。
1赞
Alex Howansky
9/9/2023
Apache 控制进程以 root 身份运行。生成的连接处理程序不会。更改命令以找出要切换到哪个用户。exec('whoami');
1赞
Alex Howansky
9/9/2023
是的,好吧,你不能从一个非特权帐户设置时钟,实际上以root身份运行你的Web服务器是一个很大的安全漏洞。我很困惑,为什么你首先要从本地托管的 Web 表单设置时钟?
1赞
Alex Howansky
9/9/2023
通过SSH从另一台服务器推送日期?ssh root@whatever 'date -s "2023-09-08 20:49:28"'
评论