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

最佳实践:从PHP站点管理系统程序,php,ubuntu,Php,Ubuntu,我正在开发一个VPN注册站点,它是用PHP编写的,运行在VPN服务器运行的同一台Ubuntu服务器上。它允许用户注册VPN服务,但目前它只是通过电子邮件向支持人员发送他们的信息,他们可以手动编辑服务器上的配置文件。我使用PPP来处理身份验证,因此我有一个包含如下信息的文件: # user server password ip test l2tpd testpassword * 为了将新用户添加到VPN服务中,必须

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

# user      server      password            ip
test        l2tpd       testpassword        *
为了将新用户添加到VPN服务中,必须将其详细信息附加到上表中,并且命令

sudo /etc/init.d/xl2tpd restart
运行以应用新更改。我想做的是使这个过程自动化。据我所知,有两种选择。一种是创建一个shell脚本,然后使用
shell_exec('./adduser testpassword')。另一种方法是直接在PHP中完成,方法是打开文件,修改文件,然后再次保存


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

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

您可以将其与包装器脚本相结合,以便php只执行具有有限权限的本地化脚本

因此,我们称之为“restart_auth.sh”的包装器脚本可能包含:

#!/bin/sh

sudo /etc/init.d/xl2tpd restart
然后从php中
shell\u exec('restart\u 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\u exec()
行上传递数据。但是,这仍然会引入不安全性,因此确保写入文件的值未被篡改是最重要的


此外,即使作为cron作业,也不要将完整脚本作为root运行,而是使用与sudoers相同的方法,只允许运行的脚本作为root执行特定命令。例如,您可以允许
sudo“cat changes.txt>>auth_file”

我将它们全部添加到一个“挂起”数据库表中,然后每小时执行一次cron脚本以拉出挂起的,附加到现有配置文件的末尾,保存,重新启动守护进程。以root用户身份运行cron,使其与web前端隔离,并让您的客户知道他们的vpn将在一小时内准备就绪,他们将收到确认完成的电子邮件。在注册和更改vpn用户之间确实需要一堵墙。您是否需要对新用户进行任何身份验证或背景检查?
sudo
不需要密码吗?@RichardChambers通常不需要。一旦用户注册并验证了他们的电子邮件,我们会将他们带到一个计划选择页面,在收到我们的支付提供商的支付确认回调后,我们通常会手动创建他们的帐户,这是我们希望避免的步骤。这看起来是一个不错的选择。