Apache web 服务器提供了这种便利 :通过 HTTP 或 HTTPS 协议,访问文
件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。所以,
使用 PHP 时要小心。以下是 25 个 PHP 安全方面的最佳实践,可供系统管理
员们安全地配置 PHP。
为 PHP 安全提示而提供的示例环境
◆文件根目录(DocumentRoot):/var/www/html
◆ 默 认 的 Web 服 务 器 :Apache(可 以 使 用 Lighttpd 或 Nginx 来 取 代
Apache)
◆默认的 PHP 配置文件 :/etc/php.ini
◆默认的 PHP 加载模块配置目录 :/etc/php.d/
◆我们的示例 php 安全配置文件 :/etc/php.d/security.ini(需要使用文
本编辑器来创建该文件)
◆ 操 作 系 统 :RHEL/CentOS/Fedora Linux(相 关 指 令 应 该 与 Debian/
Ubuntu 等其他任何 Linux 发行版或者 OpenBSD/FreeBSD/HP-UX 等其他类
似 Unix 的操作系统兼容)。
◆默认的 php 服务器 TCP/UDP 端口 :无
将所有PHP错误记入日志
别让 PHP 错误信息暴露在网站的所有访客面前。编辑 /etc/php.d/
security.ini,执行以下指令 :
display_errors=Off
确保你将所有 PHP 错误记入到日志文件中 :
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log
不允许上传文件
出于安全原因,编辑 /etc/php.d/security.ini,执行以下命令 :
file_uploads=Off
如果使用你应用程序的用户需要上传文件,只要设置 upload_max_
filesize,即可启用该功能,该设置限制了 PHP 允许通过上传的文件的最大
值 :
file_uploads=On
# 用户通过 PHP 上传的文件最大 1MB
upload_max_filesize=1M
关闭远程代码执行
如 果 启 用,allow_url_fopen 允 许 PHP 的 文 件 函 数 —— 如 file_get_
contents()、include 语句和 require 语句——可以从远程地方(如 FTP 或网站)
获取数据。
allow_url_fopen 选项允许 PHP 的文件函数——如 file_get_contents()、
include 语句和 require 语句——可以使用 FTP 或 HTTP 协议,从远程地方
获取数据。编程员们常常忘了这一点,将用户提供的数据传送给这些函数
时,没有进行适当的输入过滤,因而给代码注入安全漏洞留下了隐患。基于
PHP 的 Web 应用程序中存在的众多代码注入安全漏洞是由启用 allow_url_
fopen 和糟糕的输入过滤共同引起的。编辑 /etc/php.d/security.ini,执行
以下指令 :
allow_url_fopen=Off
出于安全原因,我还建议禁用 allow_url_include :
allow_url_include=Off
启用SQL安全模式
编辑 /etc/php.d/security.ini,执行以下指令 :
sql.safe_mode=On
如果启用,mysql_connect() 和 mysql_pconnect() 就忽视传送给它们的
任何变量。请注意 :你可能得对自己的代码作一些更改。sql.safe_mode 启
用后,第三方开源应用程序(如 WorkdPress)及其他应用程序可能根本运行
不了。我还建议你针对所有安装的 php 5.3.x 关闭 magic_quotes_gpc,因
为它的过滤并不有效、不是很可靠。mysql_escape_string() 和自定义过滤
函数能起到更好的作用 :
magic_quotes_gpc=Off
控制POST请求的大小
作为请求的一部分,客户机(浏览器或用户)需要将数据发送到 Apache
Web 服务器时,比如上传文件或提交填好的表单时,就要用到 HTTP POST
请求方法。攻击者可能会企图发送过大的 POST 请求,大量消耗你的系统
资源。你可以限制 PHP 将处理的 POST 请求的最大大小。编辑 /etc/php.
d/security.ini,执行以下命令 :
; 在此设置实际可行的值
post_max_size=1K
1K 设置了 php 应用程序允许的 POST 请求数据的最大大小。该设置还
影响文件上传。要上传大容量文件,这个值必须大于 upload_max_filesize。
我还建议你限制使用 Apache Web 服务器的可用方法。编辑 httpd.conf,执
行针对文件根目录 /var/www/html 的以下指令 :
<Directory /var/www/html>
<LimitExcept GET POST>
Order allow,deny
</LimitExcept>
## 可在此添加配置的其余部分 ... ##
</Directory>
资源控制(拒绝服务控制)
你可以设置每个 php 脚本的最长执行时间,以秒为单位。另一个建议的
选项是设置每个脚本可能用于解析请求数据的最长时间,以及脚本可能耗
用的最大内存数量。编辑 /etc/php.d/security.ini,执行以下命令 :
# 设置,以秒为单位
max_execution_time = 30
max_input_time = 30
memory_limit = 40M
为PHP安装Suhosin高级保护系统
Suhosin 是一款高级的保护系统,面向安装的 PHP。它旨在保护服务器和
用户,远离 PHP 应用程序和 PHP 核心中的已知缺陷和未知缺陷。Suhosin 分
两个独立部分,可以单独使用,也可以组合使用。第一个部分是针对 PHP 核
心的小补丁,实施了几个低级防护措施,以防范缓冲器溢出或格式字符串安
全漏洞 ;第二个部分是功能强大的 PHP 加载模块,实施了其他所有的保护措
施。
保持PHP、软件和操作系统版本最新
打安全补丁是维护Linux、Apache、PHP和MySQL服务器的一个重要环节。
应该使用以下其中任何一个工具(如果你通过软件包管理器来安装 PHP),
尽快检查所有的 PHP 安全更新版本,并尽快打上 :
# yum update 或
# apt-get update && apt-get upgrade
你可以配置红帽 /CentOS/Fedora Linux,以便通过电子邮件发送 yum 软
件包更新通知。另一个选项是通过 cron job(计划任务)打上所有的安全
更新版。在 Debian/Ubuntu Linux 下,可以使用 apticron 来发送安全通知。
注 :经常访问 php.net,寻找源代码安装的最新版本。
限制文件和目录访问
确保你以 Apache 或 www 等非根用户的身份来运行 Apache。所有文件
和目录都应该归非根用户(或 apache 用户)所有,放在 /var/www/html 下 :
# chown -R apache:apache /var/www/html/
/var/www/html/ 是个子目录,这是其他用户可以修改的文件根目录,
因为根目录从来不在那里执行任何文件,也不会在那里创建文件。
确保在 /var/www/html/ 下,文件权限设成了 0444(只读):
# chmod -R 0444 /var/www/html/
确保在 /var/www/html/ 下,所有目录权限设成了 0445 :
# find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}
关于设置合适文件权限的补充
chown 和 chmod 命令确保 :不管在什么情况下,文件根目录或文件根目
录里面的文件都可以被 Web 服务器用户 apache 写入。请注意 :你需要设
置对你网站的开发模型最合理的权限,所以可以根据自身需要,随意调整
chown 和 chmod 命令。在这个示例中,Apache 服务器以 apache 用户的身
份来运行。这可以在你的 httpd.conf 文件中用 User 和 Group 命令来配置。
apache 用户需要对文件根目录下的所有内容享有读取访问权,但是不应该
享有写入访问权。
确保 httpd.conf 有以下命令,实现限制性配置 :
<Directory / >
Options None
AllowOverride None
Order allow,deny
</Directory>
由于篇幅所限,本文仅节选了 25 条最佳实践当中的 9 条。完整内容见
原文 :
25 PHP Security Best Practices For Sys Admins
译文 :http://os.51cto.com/art/201111/305014.htmv

系统管理员必须知道的PHP安全实践的更多相关文章

  1. 「从零单排HBase 06」你必须知道的HBase最佳实践

    前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验. 1.Schema设计七大原则 1)每个region的大小应该控制在10G到 ...

  2. 《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...

  3. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  4. [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望

    发布日期:2009.05.22 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. /// <summary> /// 本文开始,将以& ...

  5. [你必须知道的.NET]第三十回:.NET十年(下)

    发布日期:2009.05.11 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. /// <summary> /// 本文部分内容,已 ...

  6. [你必须知道的.NET]第二十九回:.NET十年(上)

    发布日期:2009.05.08 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. /// <summary> /// 本文部分内容,已 ...

  7. [你必须知道的.NET]第二十三回:品味细节,深入.NET的类型构造器

    发布日期:2008.11.2 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 今天Artech兄在<关于Type Init ...

  8. [你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考

    发布日期:2008.8.27 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 走钢丝的人,在刺激中体验快感.带着问题思考,在问题 ...

  9. [你必须知道的.NET]第二十一回:认识全面的null

    发布日期:2008.7.31 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 null.nullable.??运算符.null ...

随机推荐

  1. javascript专题系列--尾调用和尾递归

    最近在看<冴羽的博客>,讲真,确实受益匪浅,已经看了javascript 深入系列和专题系列的大部分文章,可是现在才想起来做笔记.所以虽然很多以前面试被问得一脸懵逼的问题都被“一语惊醒梦中 ...

  2. appium--多点触控

    前戏 对于放大缩小的,我们使用前面的滑动是不行的,例如地图的放大缩小,这里就要用到多点触控了 MultiAction是多点触控的类,可以模拟多点触控操作,主要包含add()和perform()两个方法 ...

  3. Web协议详解与抓包实战:HTTP1协议-详解请求行(2)

    一.请求行一 二.请求行二 三.请求行三 四.常见方法(RFC7231) 实际测试截图 五.用于文档管理的 WEBDAV 方法(RFC2518) 六.WEBDAV 验证环境  1.登录  2.Wire ...

  4. .NetCore 使用k8s部署服务的过程中需要注意的地方以及遇到的问题

    这里开始我准备了3台测试服务器,这里我使用了JumpServer管理起来了,这里我们来看下: Master :192.168.0.236 Node1:192.168.0.237 Node2:192.1 ...

  5. Elasticsearch由浅入深(四)ES并发冲突、悲观锁与乐观锁、_version乐观锁并发

    ES并发冲突 举个例子,比如是电商场景下,假设说,我们有个程序,工作的流程是这样子的: 读取商品信息(包含了商品库存) 用户下单购买 更新商品信息(主要是将库存减1) 我们比如咱们的程序就是多线程的, ...

  6. 下载工具系列——Aria2 (几乎全能的下载神器)

    一.介绍 说完了前面一堆BT/PT客户端,现在终于轮到Aria2了,关于这个我就不介绍太多了,自从百度限速以来我觉得这个快变成众所周知的了,我平时也收集了各种和Aria2相关的插件或者是辅助软件之类的 ...

  7. (十五)golang--init函数

    每一个源文件都会包含一个init函数,这个函数会在执行main()执行之前被调用,相当于python中的__init__ 注意细节:(1)如果一个文件同时包含全局变量定义,init函数和main函数, ...

  8. SpringBoot第十八篇:异步任务

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11095891.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   系统中的异 ...

  9. Extra:Cg Math Functions

    常用Cg函数 数学函数 abs(x):绝对值 // float类型的实现 float abs(float x) { return max(-a, a); } sin(x):正弦,输入为弧度 // fl ...

  10. linux中断子系统

    参考引用:http://www.wowotech.net/sort/irq_subsystem wowotech:一个很好的linux技术博客. 一.概述 目的 kernel管理硬件设备的方式:轮询. ...