php下安全执行root命令
filed in PHP/ web on Sep.15, 2008
最近写的一个程序里需要用php添加iptables防火墙规则。但是我们都知道iptables命令需要root权限才能执行。而默认php的权限只有apache的user权限。上网搜了搜,发现绝大多数都是http://www.chinaunix.net/jh/27/784289.html这篇文章里将到的方法,思路是:调用setreuid后 将有效用户id 和实际用户id互换了.使apache当前的 uid为0 这样就能执行root命令了。
但我在fedora下测试发现iptables命令没有执行成功。查了好多资料都没找到原因,后来老师提醒我可能是SELinux的原因。我把SELinux关了(/etc/sysconfig/selinux),发现执行成功了。竟然是SELinux在作怪。
但是用写c代码调换用户id的方法发现有个问题,我的ip是个变量,用这种方法并不方便。后来发现最佳的方法是在php下通过sudo执行iptables命令,既方便,又安全。具体方法:先用sprintf函数把要执行命令生成一个变量,然后调用system函数执行sudo+命令。