PHP安全配置(2)

2016-01-29 13:33 4 1 收藏

PHP安全配置(2),PHP安全配置(2)

【 tulaoshi.com - PHP 】

三、PHP本身的安全配置

PHP的配置非常灵活,可以通过php.ini, httpd.conf, .htaccess文件(该目录必须设置了AllowOverride All或Options)进行设置,还可以在脚本程序里使用ini_set()及其他的特定的函数进行设置。通过phpinfo()和get_cfg_var()函数可以得到配置选项的各个值。

如果配置选项是唯一PHP_INI_SYSTEM属性的,必须通过php.ini和httpd.conf来修改,它们修改的是PHP的Master值,但修改之后必须重启apache才能生效。其中php.ini设置的选项是对Web服务器所有脚本生效,httpd.conf里设置的选项是对该定义的目录下所有脚本生效。

如果还有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL属性的选项就可以使用.htaccess文件设置,也可以通过在脚本程序自身用ini_set()函数设定,它们修改的是Local值,改了以后马上生效。但是.htaccess只对当前目录的脚本程序生效,ini_set()函数只对该脚本程序设置ini_set()函数以后的代码生效。各个版本的选项属性可能不尽相同,可以用如下命令查找当前源代码的main.c文件得到所有的选项,以及它的属性:

# grep PHP_INI_ /PHP_SRC/main/main.c



在讨论PHP安全配置之前,应该好好了解PHP的safe_mode模式。

1、safe_mode

safe_mode是唯一PHP_INI_SYSTEM属性,必须通过php.ini或httpd.conf来设置。要启用safe_mode,只需修改php.ini:

safe_mode = On
或者修改httpd.conf,定义目录:

Options FollowSymLinks
php_admin_value safe_mode 1




重启apache后safe_mode就生效了。启动safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数。

所有操作文件的函数将只能操作与脚本UID相同的文件,比如test.php脚本的内容为:


几个文件的属性如下:
# ls -la
total 13
drwxr-xr-x 2 root root 104 Jul 20 01:25 .
drwxr-xr-x 16 root root 384 Jul 18 12:02 ..
-rw-r--r-- 1 root root 4110 Oct 26 2002 index.html
-rw-r--r-- 1 www-data www-data 41 Jul 19 19:14 test.php



在浏览器请求test.php会提示如下的错误信息:

Warning: SAFE MODE Restriction in effect. The script whose uid/gid is 33/33 is not allowed to access ./index.html owned by uid/gid 0/0 in /var/www/test.php on line 1

如果被操作文件所在目录的UID和脚本UID一致,那么该文件的UID即使和脚本不同也可以访问的,不知这是否是PHP的一个漏洞还是另有隐情。所以php脚本属主这个用户最好就只作这个用途,绝对禁止使用root做为php脚本的属主,这样就达不到safe_mode的效果了。

如果想将其放宽到GID比较,则打开 safe_mode_gid可以考虑只比较文件的GID,可以设置如下选项:

safe_mode_gid = On

设置了safe_mode以后,所有命令执行的函数将被限制只能执行php.ini里safe_mode_exec_dir指定目录里的程序,而且shell_exec、`ls -l`这种执行命令的方式会被禁止。如果确实需要调用其它程序,可以在php.ini做如下设置:

safe_mode_exec_dir = /usr/local/php/exec

然后拷贝程序到该目录,那么php脚本就可以用system等函数来执行该程序。而且该目录里的shell脚本还是可以调用其它目录里的系统命令。

safe_mode_include_dir string

当从此目录及其子目录(目录必须在 include_path 中或者用完整路径来包含)包含文件时越过 UID/GID 检查。

从 PHP 4.2.0 开始,本指令可以接受和 include_path 指令类似的风格用分号隔开的路径,而不只是一个目录。

指定的限制实际上是一个前缀,而非一个目录名。这也就是说safe_mode_include_dir = /dir/incl将允许访问/dir/include和/dir/incls,如果它们存在。如果您希望将访问控制在一个指定的目录,那么请在结尾加上一个斜线,例如:safe_mode_include_dir = /dir/incl/。

safe_mode_allowed_env_vars string

设置某些环境变量可能是潜在的安全缺口。本指令包含有一个逗号分隔的前缀列表。在安全模式下,用户只能改变那些名字具有在这里提供的前缀的环境变量。默认情况下,用户只能设置以 PHP_ 开头的环境变量(例如 PHP_FOO = BAR)。

注: 如果本指令为空,PHP 将使用户可以修改任何环境变量!

safe_mode_protected_env_vars string

本指令包含有一个逗号分隔的环境变量的列表,最终用户不能用 putenv() 来改变这些环境变量。甚至在 safe_mode_allowed_env_vars 中设置了允许修改时也不能改变这些变量。

虽然safe

来源:https://www.tulaoshi.com/n/20160129/1490604.html

延伸阅读
标签: PHP
  怕忘记, 记录再此. 这个两个服务器上的设置, 都只是参考. php 4.3.11 ./configure --prefix=/home/raid/system/php --with-mysql=/home/raid/system/mysql/ --with-apxs=/home/raid/system/apache/bin/apxs --with-gd --with-zlib --with-freetype-dir=/usr/ --with-png-dir=/usr/ --with-jpeg-dir=/usr/ --disable-posix --...
标签: PHP
今天,我们来侃侃PHP.INI文件中的一些有趣的内容吧。 PHP.INI文件相信每位PHP爱好者都不会陌生,在PHP的上一个版本PHP3.0中它被命名为PHP3.INI。用NOTEPAD打开它,文件通常在操作系统的Windows目录下。大家都看到,PHP.INI文件里面有很多分号,和Windows系统一样,这些分号用来表示注解,也就是说为了配置文件清晰易懂,开...
标签: PHP
在配置向导的下一个窗口中,系统询问你是否希望将 MySQL 安装为一项Windows服务,以及这项服务是否应随服务器一同启动。另外,还要求你决定是否将MySQL命令添加到Windows路径中。我做出明智选择,让MySQL服务随操作系统一起启动,并选择修改系统路径。(图11) 网络 服务器和 数据库 的安全也是重要的因素。同样,你应该为...
标签: PHP
在详细选项上,除了上述的安装简介外,也可以在编译时加入其它的选项。 apache模块 语法: --with-apache=DIR 说明: 用本选项可以让 PHP 以apache的模块方式使用,DIR 的字符串可以是 /usr/local/apache 或其它安装apache的目录 范例: --with-apache=/var/lib/apache fhttpd 服务器模块 语法: --with-fhttpd=DIR 说明:...
标签: PHP
今天,我们来侃侃PHP.INI文件中的一些有趣的内容吧。 PHP.INI文件相信每位PHP爱好者都不会陌生,在PHP的上一个版本PHP3.0中它被命名为PHP3.INI。用NOTEPAD打开它,文件通常在操作系统的Windows目录下。大家都看到,PHP.INI文件里面有很多分号“”,和Windows系统一样,这些分号用来表示注解,也就是说为了配置文件清晰易懂,开发者在分号...

经验教程

723

收藏

38
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部