最佳实践:从PHP站点管理系统程序

时间:2014-04-01 13:22:54

标签: php ubuntu

我正在使用VPN注册站点,该站点是用PHP编写的,并运行在运行VPN服务器的同一个Ubuntu服务器上。它允许用户注册VPN服务,但目前只是通过电子邮件向支持人员发送信息,他们手动编辑服务器上的配置文件。我使用PPP来处理身份验证,因此我有一个包含以下信息的文件:

# user      server      password            ip
test        l2tpd       testpassword        *

为了将新用户添加到VPN服务,他们的详细信息必须附加到上表和命令

sudo /etc/init.d/xl2tpd restart

运行以应用新更改。我要做的是自动化该过程。据我所知,有两种选择。一种是创建一个shell脚本,然后使用shell_exec('./adduser test testpassword');。另一种是直接在PHP中执行,打开文件,修改文件并再次保存。

从安全和速度的角度来看,哪种方法更好,还是有另一种我没有想到的方法?

1 个答案:

答案 0 :(得分:2)

sudo可以配置为仅针对特定用户执行特定命令,因此修改sudoers文件意味着您可以以更安全的方式使用sudo来执行特定命令。

您可以将其与包装脚本结合使用,以便php仅执行具有有限权限的本地化脚本。

所以你的包装脚本,我们称之为'restart_auth.sh`可能包含:

#!/bin/sh

sudo /etc/init.d/xl2tpd restart

然后您将从php shell_exec('restart_auth.sh')运行该脚本。

您可以编辑sudoers文件,以允许脚本运行的用户(您的php用户)运行/etc/init.d/xl2tpd。所以如果你的php用户是www_data编辑sudoers(使用visudo)来包含:

user host = (www_data) NOPASSWD: /etc/init.d/xl2tpd

如果没有受污染的数据(可能包含shell转义字符的未经验证的信息)被传递给shell exec命令,那么它是安全的。

正如其他人所建议的那样,将数据写入待处理列表可能会更好,然后从中读取,而不是将其传递到shell_exec()行。然而,这仍然会带来不安全感,因此确保您写入文件的值不受污染是最重要的。

也永远不会以root身份运行完整脚本,即使是作为cron作业,而是使用与sudoers相同的方法,只允许运行脚本以root身份执行特定命令。例如,您可以允许sudo "cat changes.txt >> auth_file"