快捷搜索:   nginx

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

allow_url_fopen = On                (允许打开URL文件,预设启用)
allow_url_fopen = Off                (禁止打开URL文件)
allow_url_include = Off                (禁止引用URL文件,新版增加功能,预设关闭)
allow_url_include = On                (允许引用URL文件,新版增加功能)

allow_url_fopen 这个命令选项启动了URL形式的fopen封装协议, 使得PHP程序可以连接URL
对象(如远端文件). 预定的封装协议提供用ftp和http协议来连接远程文件,一些扩展库例如
zlib可能会注册更多的封装协议. allow_url_include预计是下一个PHP版本将要提供的功能,
用来分离fopen和include函数的远端调用,现在PHP5.20已经提供了这个选项.

就性能方面来说,PHP所提供的方便的远程调用确实简化了很多应用, 但若是从安全角度来看,
允许引用(Include)URL远端资源,使得PHP应用程序的漏洞变得更加容易被利用, 这种方便性
反而被很多安全研究人员视为一种漏洞(Remote URL Include vulnerabilities), 因此常常
被建议必须在php.ini配置中禁止使用.

PHP的开发者计划在PHP6版本中提供allow_url_include,现在这个功能已经可以在PHP5.20版
中应用. 禁止allow_url_include解决了远端引用(Include)的问题, 同时又让我们还可以在
一般的情形下使用fopen去打开远端的档案, 而不必再牵连上打开include函数所带来的风险.
因此在新版PHP中allow_url_fopen选项预设是打开的,而allow_url_include则预设是关闭的.

然而事实上若从系统角度来看,即使禁止了PHP的allow_url_fopen和allow_url_include功能,
其实也不能完全阻止远端调用及其所带来的安全隐忧,而且它们只是保护了标记为URL的句柄,
也就是说只能影响http(s)和ftp(s)的调用, 但对包含其他标记的远端调用,例如对PHP5.2.0
新版所提供的php和data则无能为力,而这些调用一样会导致注入风险,请参考如下代码:

// The following Include statement will
// include and execute everything POSTed
// to the server

include “php://input”;
?>

// The following Include statement will
// include and execute the base64 encoded
// payload. Here this is just phpinfo()

include “data:;base64,PD9waHAgcGhwaW5mbygpOz8+”;
?>

当然在LINUX的系统层级上,还有别的办法可用来防止远端调用, 例如使用IPTABLES等防火墙
工具来保护系统,另外PHP应用程序也可以考虑采用curl来读取远程文件.

请注意: 只在PHP4.0.3之后的版本中才可以在php.ini配置文件中使用allow_url_fopen选项,
在PHP4.0.3以及之前的版本, 则只能在编译时通过配置项 –disable-url-fopen-wrapper来
取消此特性. Windows下的PHP在4.3版本之前,相关函式: include, include_once, require,
require_once 不支援远程文件连接,在PHP4.3版本之后才可以让这类函式有远端读取的能力.

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

php_admin_flag allow_url_fopen Off
php_admin_flag allow_url_include Off
或者:
php_admin_value allow_url_fopen 0
php_admin_value allow_url_include 0

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

================================================================================
8) Error handling and logging: 错误控制和日志
——————————————————————————–

display_errors = On        (打开错误显示)
display_errors = Off        (关闭错误显示)

PHP缺省是打开错误信息显示的,如果把它改为关闭之后, 那么当PHP函数执行时,其错误信息
将不会再显示给用户,这样能在一定程度上防止攻击者从错误信息得知脚本的物理位置,以及
一些其它有用的信息,起码给攻击者的黑箱检测造成一定的障碍.

如果PHP的错误信息对我们自己有用,也可以设置成把它写到日志文件中去,例如:
log_errors = Off (PHP 默认是关闭错误日志的)
log_errors = On (修改为打开并记录错误日志)

如果打开了日志记录,接着还需要指定日志文件,即告诉PHP将错误记录到那个文件中去:
;error_log = filename (默认被分号”;”所注释,修改为如下)
error_log = /var/log/php_error.log
就是把filename改为指定文件”/var/log/php_error.log”, 这样设置以后,所有的PHP错误都
将会写到这个日志文件裡去。

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

php_admin_flag display_errors Off
或者:
php_admin_value display_errors 0

为方便区分,可在每个用户的VirtualHost中指定错误日志文件:
ErrorLog logs/mydomain.com-error_log
================================================================================

################################################################################
PHP安全配置范例:
################################################################################
================================================================================

顶(0)
踩(0)

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

最新评论