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



我正在开发一个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中执行此操作,方法是打开文件,修改文件并再次保存。

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

>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"

最新更新