系统管理员必须知道的PHP安全实践

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
相关文章
相关标签/搜索