快捷搜索:   nginx

Linux下Apache与PHP安全相关设置(2)


================================================================================

================================================================================
(3) open_basedir: 将用户可操作的文件限制在某目录下;
——————————————————————————–
如下是php.ini中的原文说明以及默认配置:
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory or
; per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir = .

open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也
可用符号”.”来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。
举例来说: 若”open_basedir = /dir/user”, 那么目录 “/dir/user” 和 “/dir/user1″都是
可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成:
“open_basedir = /dir/user/”

open_basedir也可以同时设置多个目录, 在Windows中用分号分隔目录,在任何其它系统中用
冒号分隔目录。当其作用于Apache模块时,父目录中的open_basedir路径自动被继承。

有三种方法可以在Apache中为指定的用户做独立的设置:

(a) 在Apache的httpd.conf中Directory的相应设置方法:

php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/

(b) 在Apache的httpd.conf中VirtualHost的相应设置方法:

php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /var/www/html/:/var/tmp/

(c) 因为VirtualHost中设置了open_basedir之后, 这个虚拟用户就不会再自动继承php.ini
中的open_basedir设置值了,这就难以达到灵活的配置措施, 所以建议您不要在VirtualHost
中设置此项限制. 例如,可以在php.ini中设置open_basedir = .:/tmp/, 这个设置表示允许
访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录.

请注意: 若在php.ini所设置的上传文件临时目录为/tmp/, 那么设置open_basedir时就必须
包含/tmp/,否则会导致上传失败. 新版php则会提示”open_basedir restriction in effect”
警告信息, 但move_uploaded_file()函数仍然可以成功取出/tmp/目录下的上传文件,不知道
这是漏洞还是新功能.
================================================================================

================================================================================
(4) disable_functions: 单独地屏蔽某些函式(常用于禁止普通用户执行系统函数);
——————————————————————————–
这个指令允许你基于安全原因直接禁止某些确定的函式(通常是攸关系统安全的函数),例如:
disable_functions = shell_exec,system,exec,passthru,show_source,get_cfg_var

disable_functions接受逗号分隔的函式名列表作为参数, 它不受安全模式的影响,而且只能
设置在php.ini中用作全局性配置, 不能将其设置在httpd.conf中针对单独用户来进行设置.

从php-4.0.1开始在php.ini里引入了此项功能, 这个功能非常有用, 可以用它禁止用户使用
一些具有潜在的危险性的函数, 例如: passthru,exec,system,popen 等等. 当您在php.ini
中加上 disable_functions = passthru,exec,system,popen 配置后, PHP在执行这些函数
时就只会显示错误提示: Warning: system() has been disabled for security reasons

下面举个例子来看看这个安全性设置的重要程度:

我们知道PHP脚本可以采用很多perl的特性,例如通过一种叫shell_exec的方法来执行系统的
命令, 只需在一对反引号(“)中包含调用系统命令的script代码, 就能执行相应的系统命令.
例如:

$output = `ls /etc -al`;
echo $output;
?>

显然,如果您的系统不加限制的话,那么任何用户都可以通过诸如 `cat /etc/passwd` 这样的
命令攫取系统信息或进行破坏行为. 这对于提供公共服务的ISP供应商来说, 等于是打开自家
金库大门让所有客户自由出入, 而且一旦某些客户的PHP程序存在安全漏洞(就目前PHP程序员
的平均水准来看,存在严重的漏洞基本上是不可避免的)的话, 那么只需最低级的黑客都可以
很简单地完全操控您的主机了. 因此一定要防止Linux用户在PHP程序中通过“来执行script
脚本,这可以通过在PHP.INI中设置: disable_functions = shell_exec,system,exec 来禁止
PHP调用相关系统函数.

典型的安全性配置,请参考如下设置:

disable_functions = shell_exec,system,exec,passthru,show_source,get_cfg_var

若允许用户调试程序,则可配置如下:

disable_functions = shell_exec,system,exec,passthru

PHP中一些常用但有安全风险的函数:

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论