我正在尝试从PHP代码访问文件/etc/ipsec.conf
。该代码首先在windows服务器上进行了测试,此时我已经获得了c:'abc'ipsec.conf
的访问权限。访问是在wamp中的httpd.conf中使用此提供的
<Directory "c:/abc/">
Allow from all
Deny from none
Order allow,deny
</Directory>
现在,当我尝试在Suse Linux中测试代码时,我收到了这个错误
**Warning: fopen(/etc/ipsec.conf) [function.fopen]: failed to open stream: Permission denied in /srv/www/htdocs/nsg/_ipsec.php on line 6**
我已授予777对/etc
目录和该文件的权限。目录/etc
也被添加到httpd.conf
中,但我仍然收到相同的错误。
/etc
777是个坏主意。
要从php脚本中获得访问权限,您应该将文件的组(请参阅chown
)更改为apache.php正在操作的同一组,并通过chmod
授予适当的组权限。出于安全考虑,apache只能访问/etc
中的唯一文件。
编辑如果您使用的是SEliunx或类似的东西,这可能不起作用。我只是想指出一般的方法(不是777文件)。
当然,还要净化你的输入,防止路径遍历,并保持偏执。
编辑2
注意:当启用安全模式时,PHP会检查脚本正在操作的具有与脚本相同的UID(所有者)正在执行。
因此,您应该真正确保,在安全模式打开的情况下,wwwrun
用户与拥有/etc
的用户在同一组中(在此处放弃有关安全问题的红旗)。否则,您只需将其应用于要对其进行读写的conf文件。
但是,为了满足安全性和权限,Apache2-suEXEC可能是您的解决方案。
suEXEC功能为Apache用户提供了在不同于主叫web服务器的用户ID的用户ID。通常,当CGI或SSI程序执行时,它以运行web服务器的同一用户身份运行。
所以你只需要创建一个独立的用户。
我建议您编写一个SUID帮助程序可执行文件,根据PHP脚本的要求更改/etc/ipsec.conf
。然后,PHP脚本可以执行SUID可执行文件来发出所需的命令。
这个解决方案非常安全。您的SUID可执行文件可以确保只对ipsec.conf
进行授权更改,这在您的Web服务器和关键文件之间添加了另一层。
如果你小心的话,你可以用PHP编写帮助程序的可执行文件。在这种情况下,您必须使用sudo
(并相应地配置/etc/sudoers
),因为脚本不能直接成为SUID。