• wamp/wnmp
  • lamp/lnmp

PHP核心配置简介

必须非常熟悉PHP官方配置说明:http://www.php.net/manual/zh/ini.list.php

先了解PHP_INI_* 的几个定义值。

| 常量 | 含义 |
| :------------: | :-----------------------------------------------------: |
| PHP_INI_USER | 该配置选项可在用户的PHP脚本或者Windows注册表中设置 |
| PHP_INI_PERDIR | 该配置选项可在php.ini .htaccesshttpd.conf中设置 |
| PHP_INI_SYSTEM | 该配置选项可在php.inihttpd.conf中设置 |
| PHP_INI_ALL | 该配置选项可在任何地方进行设置 |
| php.ini only | 该配置选项可仅可在php.ini中配置 |

1、register_globals (全局变量注册开关)

register_globals=on的情况下,会直接把用户的GET、POST等方式提交上来的参数注册成为全局变量并初始化值为参数对应的值。

​ 该选项在PHP <= 4.2.3版本时候设置为PHP_INI_ALL,从PHP 5.3.0起被废弃。PHP 5.4.0 移除了该选项。

2、allow_url_include (是否允许包含远程文件)

allow_url_include=on的情况下,可以直接包含远程文件,当存在include($var)$var可控的情况下,可以直接控制$var变量来执行PHP代码。

allow_url_include在PHP 5.2.0版本后默认设置为off,且配置范围是PHP_INI_ALL。类似的还有allow_url_fopen,配置是否允许打开远程文件,不过影响没有allow_url_include大。

3、magic_quotes_gpc (魔术引号自动过滤)

magic_qutoes_gpc=on且不存在编码或者其他特殊绕过的情况下,可以使得很多漏洞无法利用。当开启时,会自动在GET、POST、COOKIE变量中的单引号(')双引号(")空字符(Null)的前面加上反斜杠\

​ 但是在PHP 5中的 magic_qutoes_gpc并不会过滤$_SERVER变量,导致类似client-ip、referer一类的漏洞能够被利用。

4、magic_qutoes_runtime (魔术引号自动过滤)

​ 与magic_qutoes_gpc的区别在于处理对象不一样,magic_qutoes_runtime只对从数据库或者文件中获取的数据进行过滤。

magic_qutoes_runtime在PHP 5.4之后取消,配置范围是PHP_INI_ALL

​ 但是有一点要记住,只有部分函数受它影响,所以在某些情况下这个配置可以绕过的。受影响的列表如下:

  • get_meta_tags()
  • file_get_contents()
  • file()
  • fgets()
  • fwrite()
  • fread()
  • fputcsv()
  • stream_socket_recvfrom()
  • exec()
  • system()
  • passthru()
  • stream_get_contents()
  • bzread()
  • gzfile()
  • gzgets()
  • gzwrite()
  • gzread()
  • exif_read_data()
  • dba_insert()
  • dba_replace()
  • dba_fetch()
  • ibase_fetch_row()
  • ibase_fetch_assoc()
  • ibase_fetch_object()
  • mssql_fetch_row()
  • mssql_fetch_object()
  • mssql_fetch_array()
  • mssql_fetch_assoc()
  • mysqli_fetch_row()
  • mysqli_fetch_array()
  • mysqli_fetch_assoc()
  • mysqli_fetch_object()
  • pg_fetch_row()
  • pg_fetch_assoc()
  • pg_fetch_array()
  • pg_fetch_object()
  • pg_fetch_all()
  • pg_select()
  • sybase_fetch_object()
  • sybase_fetch_array()
  • sybase_fetch_assoc()
  • SplFileObject::fgets()
  • SplFileObject::fgetcsv()
  • SplFileObject::fwrite()

5、magic_qutoes_sybase (魔术引号自动过滤)

magic_qutoes_sybase=on的情况下,会覆盖掉magic_qutoes_gpc=on的配置,即使配置了gpc=on也是没有效果,这个指令与gpc的共同点是处理的对象一致,而它们的处理方式不一样,magic_qutoes_sybase仅仅是转义了空字符和把单引号变成了双引号。

​ 相比gpc该指令用的更少,配置范围是PHP_INI_ALL,在PHP 5.4.0中移除了该选项。

6、safe_mode (安全模式)

安全模式是PHP内嵌的一种安全机制,当safe_mode=on时,可以联动的配置指令如下:

  • safe_mode_include_dir

  • safe_mode_exec_dir

  • safe_mode_allowed_env_vars

  • safe_mode_protected_env_vars

    其配置指令范围为PHP_INI_SYSTEM, PHP 5.4之后取消。

这个配置会出现以下限制:

所有文件操作函数显示

例如unlink() file() include()等,如果有一些脚本文件放在非Web服务启动用户所有的目录下,需要利用include等函数来加载一些类或函数,可以使用safe_mode_include_dir指令配置可以包含的路径。

执行命令或程序会出错

通过函数popen() system()以及 exec()等执行命令或者程序就会提示错误,如果需要使用一些外部脚本,可以把他们放到一个目录下,然后使用safe_mode_exec_dir()指令指向脚本的目录。

受影响函数列表

  • apache_request_headers()
  • ackticks()
  • hdir()
  • hgrp()
  • chmode()
  • chown()
  • copy()
  • dbase_open()
  • dbmopen()
  • dl()
  • exec()
  • filepro()
  • filepro_retrieve()
  • ilepro_rowcount()
  • fopen()
  • header()
  • highlight_file()
  • ifx_*
  • ingres_*
  • link()
  • mail()
  • max_execution_time()
  • mkdir()
  • move_uploaded_file()
  • mysql_*
  • parse_ini_file()
  • passthru()
  • pg_lo_import()
  • popen()
  • posix_mkfifo()
  • putenv()
  • rename()
  • zmdir()
  • set_time_limit()
  • shell_exec()
  • show_source()
  • symlink()
  • system()
  • toucu()

7、open_basedir (PHP可访问目录)

open_basedir指令用来限制PHP只能访问哪些目录,通常只需要设置Web文件目录即可,如果需要加载外部脚本,也需要把脚本所在目录路径加入到open_basedir指令中,多个目录以;分割。

注意:指定的限制时实际上是前缀,而不是目录名,例如open_basedir=/www/a那么目录/www/a和/www/ab是可以访问的,如果要将访问仅限制在指定的目录内,将其设置成open_basedir=/www/a/

​ 该指令的配置范围在PHP < 5.2.3 时是 PHP_INI_SYSTEM,在PHP > 5.2.3 是PHP_INI_ALL

8、disable_functions (禁用函数)

​ 可以使用disable_functions来禁止一些敏感函数的使用,当想用本指令禁止一些危险函数时候,一定要把dl()函数也加入到禁止列表中。

​ 攻击者可以用dl()函数来加载自定义的PHP扩展以突破disable_functions指令的限制

​ 配置范围为php.ini only。配置禁用函数时使用逗号分隔函数名。

9、display_errors 和 error_reporting (错误显示)

dirsplay_errors表明是否显示PHP脚本内部错误的选项,在调试的时候通常会打开,在生产环境下,建议关闭,

error_reporting用来配置错误显示的级别,可以使用数字也可以使用内置的常量配置。

​ 两个指令配置范围都是PHP_INI_ALL

说点什么吧...