一、PHP核心配置详解php
代码在不一样的环境下执行的结果也会大有不一样,可能就由于一个配置问题,致使一个很是高危的漏洞可以利用;也可能你已经找到的一个漏洞就由于你的配置问题,致使你鼓捣好久都没法构形成功的漏洞利用代码。mysql
然而,在不一样的PHP版本中配置指令也有不同的地方,新版可能会增长或者删除部分指令,改变指令默认设置或者固定设置指令,才能高效地挖掘到高质量的漏洞。程序员
PHP_IN_*常量的定义sql
常量 | 含义 |
PHP_IN_USER | 该配置选项可在用户的PHP脚本或windows注册表中设置 |
PHP_IN_PERDIR | 该配置选项可在php.ini. .htaccess或httpd.conf中设置 |
PHP_IN_SYSTEM | 该配置选项可在php.ini或httpd.conf中设置 |
PHP_IN_ALL | 该配置选项可在任何地方设置 |
php.in only | 该配置选项可仅在php.ini中配置 |
一、register_globals(全局变量注册开关)数据库
该选项在设置为on的状况下,会直接把用户GET、POST等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交的参数能够直接在脚本中使用。windows
register_globals在PHP版本小于等于4.2.3时设置为PHP_INI_ALL,从PHP 5.3.0起被废弃,不推荐使用,在PHP 5.4.0中移除了该选项。安全
二、allow_url_include(是否容许包含远程文件)socket
这个配置指令对PHP安全的影响不可小觑。在该配置为on的状况下,它能够直接包含远程文件,当存在include($var)且$var可控的状况下,能够直接控制$var的变量来执行PHP代码。allow_url_include在PHP5.2.0后默认设置为off。配置范围为PHP_IN_ALL。函数
三、magic_quotes_gpc(魔术引号自动过滤)fetch
magic_quotes_gpc在安全方面作了很大贡献,只要它被开启,在不存在编码或者其余特殊绕过的状况下,可使得不少漏洞没法被利用。当该选项设置为on时,会自动在GET、POST、COOKIE变量中的单引号(')、双引号(")、反斜杠(\)及空字符(NULL)的前面加上反斜杠(\),可是在PHP 5中magic_quotes_gpc并不会过滤$_SERVER变量,致使不少相似client-ip、referer一类的漏洞可以利用。在PHP 5.3以后的不推荐使用magic_quotes_gpc。
PHP 5.4以后就取消这个选项了。在PHP版本小于4.2.3时,配置范围是PHP_INI_ALL;在PHP版本大于4.2.3时,是PHP_INI_PERDIR。
四、magic_quotes_runtime(魔术引号自动过滤)
magic_quotes_runtime也是自动在单引号(')、双引号(")、反斜杠(\)及控字符(NULL)的前面加上反斜杠(\)。它跟magic_quotes_gpc的区别是,处理的对象不同,magic_quotes_runtime只对从数据库或者文件中获取的数据进行过滤,它的做用也很是大,由于不少程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的数据一样也会有特殊字符存在,因此攻击者的作法是先将攻击代码写入数据库,在程序读取、使用到被污染的数据后便可触发攻击。
一样,magic_quotes_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_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()。
五、magic_quote_sybase(魔术引号自动过滤)
magic_quotes_sybase指令用户自动过滤特殊字符,当设置为on时,它会覆盖掉magic_quote_pgc=on的配置,也就是说,即便配置了gpc=on也是没有效果的。这个指令与gpc的共同点时处理的对象一致,即都对GET、POST、Cookie进行处理。而它们以前的区别在于处理方式不同,magic_quotes_sybase仅仅是转义了空字符和把单引号(')变为双引号(")。与gpc相比,这个指令使用得更少,它的配置范围是PHP_INI_ALL,在PHP 5.4.0中移除了该选项。
六、safe_mode(安全模式)
安全模式是PHP内嵌的一种安全机制,当safe_mode=on时,联动能够配置的指令有safe_mode_include_dir、safe_mode_exec_dir、safe_mode_allowed_env_vars、safe_mode_protected_env_vars。safe_mode指令的配置范围为PHP_INI_SYSTEM,PHP 5.4以后被撤销了。
七、open_basedir PHP可访问目录
open_basedir指令用来显示PHP只能访问哪些目录,一般咱们只须要设置Web文件目录便可,若是须要加载外部脚本,也须要把脚本所在目录路径加入到open_basedir指令中,多个目录以分号(;)分割。使用open_dabasedir须要注意一点是,指定的限制其实是前缀,而不是,目录名。例如,若是配置open_basedir=/www/a,那么目录/www/a和/www/b均可以访问的。因此若是要将访问限制在指定目录内,请用斜线结束路径名。例如设置成:open_basedir=/www/a。
当open_basedir配置目录后,执行脚本访问其余文件都须要验证文件路径,所以在执行效率上面也会有必定影响的。该指令的配置范围在PHP版本小于5.2.3时是PHP_INI_SYSTEM。在PHP版本大于等于5.2.3是PHP_INI_ALL。
八、disable_functions(禁用函数)
在正式的生产环境中,为了更安全地运行PHP,也可使用disable_function指令来禁止一些敏感函数的使用。当你想用本指令禁止一些危险函数时,切记要把dl()函数也加到禁止列表,由于攻击者能够利用dl()函数来加载自动以的PHP扩展以突破disable_functions指令的限制。
本指令配置范围为php.ini only。配置禁用函数时使用逗号分割函数名,例如:disable_functions=phpinfo.eval.passthru.exec,system。
九、display_errors和error_reporting错误显示
display_errors代表是否显示PHP脚本内部错误的选项,在调试PHP的时候,一般都把PHP错误显示打开,可是在生产环境中,建议关闭PHP错误回显,即设置display_errors=off,以免带来一些安全隐患。在设置display_errors=on时,还能够配置的一个指令是error_reporting,这个选项用来配置错误显示的级别,可以使用数字也可以使用内置常量。
这两个指令的配置范围都是PHP_INI_ALL。