提升PHP安全:8个必须修改的PHP默认配置

很明显,PHP+Mysql+Apache是很流行的web技术,这个组合功能强大,可扩展性强,还是免费的。然而,PHP的默认设置对已经上线的网站不是那么适合。下面通过修改默认的配置文件加强PHP的安全策略!

0x01:禁用远程url文件处理功能

像fopen的文件处理函数,接受文件的rul参数(例如:fopen('http://www.yoursite.com','r')).),这个功能可以很轻松的访问远程资源,然而,这是一个很重要的安全威胁,禁用这个功能来限制file function是个不错的选择,在php.ini文件中做如下修改:

代码如下:

allow_url_fopen = Off

0x02:禁用注册全局变量

php在4.2.0以前的版本中,用全局变量作为输入,这个功能叫做register_globals,在web应用中它引起了很多安全问题,因为它允许攻击者在一些情况下很容易的操作全局变量,幸运的是在4.2.0这个功能默认被禁用,它非常的危险,无论在什么情况下都要禁用这个功能。如果某些脚本需要这个功能,那么这个脚本就存在潜在的安全威胁。修改pnp.ini来禁用这个功能:

代码如下:

register_globals = Off

0x03:限制php的读写操作

在很多web开发的过程中,php脚本需要向本地文件系统进行读写操作,比如/var/www/htdocs/files,为了加强安全,你可以修改本地文件的读写权限:

代码如下:

open_basedir = /var/www/htdocs/files

0x04:Posing Limit

限制PHP的执行时间、内存使用量、post和upload的数据是最好的策略,可以做如下的配置:

代码如下:

max_execution_time = 30  ; Max script execution time
max_input_time = 60      ; Max time spent parsing input
memory_limit = 16M       ; Max memory used by one script
upload_max_filesize = 2M ; Max upload file size
post_max_size = 8M       ; Max post size

0x05:禁用错误消息和启用日志功能

在默认设置中,php会向浏览器输出错误消息,在应用程序的开发过程中,这个默认设置是最合理的配置,然而,它也可以向用户泄漏一些安全信息,例如安装路径和用户名。在已经开发完成的网站中,最好禁用错误消息然后把错误消息输出到日志文件中。

代码如下:

display_errors = Off
log_errors = On

0x06:隐藏PHP文件

如果没有隐藏PHP文件,我们可以通过多种方法获取服务器PHP的版本,例如使用:http://www.example.com/script.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

显然,我们不希望用户可以直接获取你网站服务器的PHP版本,幸运的是,在php.ini中有个开关可以禁用这个功能:

代码如下:

expose_php = Off

0x07:安全模式配置

在默认的情况下,php可以配置为安全模式,在这种模式下,Apache禁止访问文件、环境变量和二进制程序,在安全模式下,存在的最大问题就是只有文件的所有者才能访问这写PHP文件,如果有很多开发者共同开发这个程序,这样的设置就不切实际,当你需要访问一个PHP文件时就需要修改这个文件的所有者,另外一个问题就是其它程序也不能访问这些PHP文件,下面的配置就可以修改文件的的权限为用户组而不是单个用户。

代码如下:

safe_mode = Off
safe_mode_gid = On

通过启用safe_mode_gid,能够使用Apache的这个群组就能够访问PHP文件。安全模式对阻止二进制文件的执行也非常有效,然而,开发者却希望在某些特定情形下能够运行一些二进制文件。在这些特殊的情形下,可以将二进制文件放进一个目录中,比如(/var/www/binaries),可以做如下设置:

代码如下:

safe_mode_exec_dir = /var/www/binaries

最后,通过下面的设置,可以访问服务器的环境变量,提供一个以”_“分割的前缀,这样只能访问具有规定前缀的环境变量:

代码如下:

safe_mode_allowed_env_vars = PHP_

0x08:限制公共用户对具有特定后缀名的文件的访问

由于安全的原因,很多具有特定后缀名的文件不能被公共用户所访问,比如.inc后缀的文件,里面包含了一些敏感的信息,比如mysql连接信息,如果没有适当的配置,那么每个用户都能访问这个配置文件,为了加强网站的安全,你需要在. .htaccess文件进行如下的配置:

代码如下:

<filesmatch>
  Order allow,deny
  Deny from all
</filesmatch>

0x09:总结

PHP的默认配置是面向开发者的,如果网站面向广大的用户,建议重新配置PHP。

(0)

相关推荐

  • php.ini 启用disable_functions提高安全

    Q. I run a small Apache based webserver for my personal use and it is shared with friends and family. However, most script kiddie try to exploit php application such as wordpress using exec() , passthru() , shell_exec() , system() etc functions. How

  • PHP防注入安全代码

    简述:/*************************    说明:    判断传递的变量中是否含有非法字符    如$_POST.$_GET    功能:防注入    **************************/ 复制代码 代码如下: <?php //要过滤的非法字符      $ArrFiltrate=array("'",";","union");      //出错后要跳转的url,不填则默认前一页      $StrG

  • PHP开发不能违背的安全规则 过滤用户输入

    作为最基本的防范你需要注意你的外部提交,做好第一面安全机制处理防火墙. 规则 1:绝不要信任外部数据或输入 关于Web应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在PHP代码中直接输入的任何数据.在采取措施确保安全之前,来自任何其他来源(比如 GET 变量.表单 POST.数据库.配置文件.会话变量或 cookie)的任何数据都是不可信任的. 例如,下面的数据元素可以被认为是安全的,因为它们是在PHP中设置的. 复制代码 代码如

  • php的mkdir()函数创建文件夹比较安全的权限设置方法

    问题描述: 使用以下php代码创建了一个目录,期望目录的权限是0777,实际结果是0755 复制代码 代码如下: mkdir('./aa/',0777); 分析与测试结果:  1.mkdir()函数指定的目录权限只能小于等于系统umask设定的默认权限. 如linux默认的umask一般0022, 即创建目录的默认权限是0755, 所以这时php  mkdir('./aa/',0777) 得到目录的权限是0755. 复制代码 代码如下: xw@xw-X201:~/Desktop/dd/aa$ u

  • 推荐一本PHP程序猿都应该拜读的书

    PHP这几年口碑很差.关于它的"糟糕设计的汇总"和语法上的矛盾有着大量的讨论,但是主要的抱怨通常是安全.很多PHP站点分分钟被黑掉,甚至一些有经验的.有见识的程序员会说,这门语言本身是不安全的. 我总是对此持反对意见,因为有常识性的原因,有如此多的PHP安全违反现象. PHP应用程序经常被黑掉是由于: PHP应用程序太多了. 它易于学习和编写. 糟糕的PHP也容易编写. 就是这么简单.PHP流行好多年了.PHP越是受欢迎,它被发现的漏洞就越多.这些黑客发现的漏洞很少是PHP处理引擎本身

  • 简单的方法让你的后台登录更加安全(php中加session验证)

    本文将以Joomla!后台链接为例,讲解如何"修改"我们的后台链接,使其更加安全. 原理:通过特定文件为后台入口注册session,否则失败退出.即直接使用原后台地址将无法登录后台.这样一来,入口文件名的多样性.可变更性将为你的后台登录提供更加安全的环境. 一.入口文件:myadmin.php(文件名可随时更改) 作用:注册session.源码如下: 复制代码 代码如下: <?php session_name( "Zjmainstay" ); //sessio

  • PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)

    浅谈Php安全和防Sql注入,防止Xss攻击,防盗链,防CSRF 前言: 首先,笔者不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记.细心总结文章,里面有些是我们phper不易发现或者说不重视的东西.所以笔者写下来方便以后查阅.在大公司肯定有专门的web安全测试员,安全方面不是phper考虑的范围.但是作为一个phper对于安全知识是:"知道有这么一回事,编程时自然有所注意". 目录: 1.php一些安全配置(1)关闭php提示错误功能(2)关闭一些"坏

  • 理解php Hash函数,增强密码安全

    1.声明 密码学是一个复杂的话题,我也不是这方面的专家.许多高校和研究机构在这方面都有长期的研究.在这篇文章里,我希望尽量使用简单易懂的方式向你展示一种安全存储Web程序密码的方法. 2."Hash"是做什么的? "Hash将一段数据(小数据或大数据)转换成一段相对短小的数据,如字符串或整数." 这是依靠单向hash函数来完成的.所谓单向是指很难(或者是实际上不可能)将其反转回来.一个常见的hash函数的例子是md5(),它流行于各种计算机语言和系统. 复制代码 代

  • php中安全模式safe_mode配置教程

    (1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(), 同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd, 但是默认的php.ini是没有打开安全模式的,我们把它打开: safe_mode = on (2) 用户组安全 当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同 组的用户也能够对文件进行访问. 建议设置为: safe_

  • php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)

    php.ini-recommended的安全等级比php.ini-dist高.默认是把display_errors 设置为 off,将magic_quotes_gpc 设置为Off等等.而相对的php.ini-dist都是默认的配置. 所以说,如果你只是想进行web测试和普通开发,使用php.ini-dist,不然就是用php.ini-recommended. 具体参阅http://www.php.net 简单说明: 如果是本地开发学习,建议复制 php.ini-dist一份保存为php.ini

随机推荐