php 安全模式废弃了怎么办

旭日升 发布于 2014/01/02 17:28
阅读 358
收藏 4
PHP
服务器环境一直依赖safe_mode 安全模式,但是在PHP5.4中却废弃了安全模式,那么怎么保证服务器运行的安全呢?
加载中
0
狂飙的小蜗牛
狂飙的小蜗牛
服务器运行的安全不应该依赖safe_mode 安全模式,应该从PHP代码,服务器防护着手
0
南湖船老大
南湖船老大
安全模式没有存在的价值
0
大王叫我来卖萌
大王叫我来卖萌
没意义,必须废除!
0
Jiazz
Jiazz
就没开过这个安全模式
0
eechen
eechen
PHP safe_mode 将检查当前脚本的拥有者是否和被操作的文件的拥有者相同。
相同则允许操作,不同则拒绝操作。

开启安全模式会降低PHP的执行效率。

现在更好的选择是使用open_basedir,限制PHP只能操作指定目录下的文件。

假设你以Nginx/PHP-FPM方式运行PHP,你可以在php.ini中这样配置:

[PATH=/srv/www/example.com/public_html]
session.save_path=/srv/www/example.com/sessions/
upload_tmp_dir=/srv/www/example.com/uploads/ 
open_basedir="/srv/www/example.com/public_html/:/tmp/:/srv/www/example.com/sessions/:/srv/www/example.com/uploads/"

这里我为 example.com独立设置了会话保存目录和文件上传临时目录,所以open_basedir也应该加入这两个路径,否则example.com下的PHP将无法操作这些文件。

eechen
eechen
回复 @旭日升 : open_basedir配置在PHP启动时就加载到内存了,PHP是可预知的,PHP只要进行判断就好。而safe_mode中PHP并不知道要打开的文件的所有者,所以首先还要获取文件所有者,然后进行判断。当然open_basedir同样会牺牲一点性能,但比safe_mode小得多。
旭日升
旭日升
open_basedir每次都在执行文件的时候检查是否在安全目录内,这样也不是对I/O操作有性能瓶颈吗?
0
eechen
eechen

引用来自“eechen”的答案

PHP safe_mode 将检查当前脚本的拥有者是否和被操作的文件的拥有者相同。
相同则允许操作,不同则拒绝操作。

开启安全模式会降低PHP的执行效率。

现在更好的选择是使用open_basedir,限制PHP只能操作指定目录下的文件。

假设你以Nginx/PHP-FPM方式运行PHP,你可以在php.ini中这样配置:

[PATH=/srv/www/example.com/public_html]
session.save_path=/srv/www/example.com/sessions/
upload_tmp_dir=/srv/www/example.com/uploads/ 
open_basedir="/srv/www/example.com/public_html/:/tmp/:/srv/www/example.com/sessions/:/srv/www/example.com/uploads/"

这里我为 example.com独立设置了会话保存目录和文件上传临时目录,所以open_basedir也应该加入这两个路径,否则example.com下的PHP将无法操作这些文件。

注意,如果PHP使用shell_exec调用系统命令,这些系统命令的执行并不受制于open_basedir,因此一般情况下还要禁用一些“危险”的PHP函数,比如:
disable_functions = passthru,exec,system,shell_exec,chroot,chgrp,chown,proc_open,proc_get_status,ini_alter,ini_restore,ini_set,dl,pfsockopen,symlink,popen,putenv

更多安全设置,可以参考阿里云帮助中心:
http://help.aliyun.com/manual?helpId=87

返回顶部
顶部