php.ini配置参数详解

下面对php.ini中一些安全相关参数的配置进行说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
register_globals
当register_globals = ON时,PHP不知道变量从何而来,也容易出现一些变量覆盖的问题。因此从最佳实践的角度,强烈建议设置 register_globals = OFF,这也是PHP新版本中的默认设置。
 
open_basediropen_basedir
可以限制PHP只能操作指定目录下的文件。这在对抗文件包含、目录遍历等攻击时非常有用,应该为此选项设置一个值。
需要注意的是,如果设置的值是一个指定的目录,则需要在目录最后加上一个“/”,否则会被认为是目录的前缀。
open_basedir = /home/web/html/
 
allow_url_include = Off
为了对抗远程文件包含,请关闭此选项,一般应用也用不到此选项。同时推荐关闭的还有allow_url_fopen。
 
display_errors = Off
错误回显,一般常用于开发模式,但是很多应用在正式环境中也忘记了关闭此选项。错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利。推荐关闭此选项。
 
log_errors = On
在正式环境下用这个就行了,把错误信息记录在日志里。正好可以关闭错误回显。
 
magic_quotes_gpc = Off
推荐关闭,它并不值得依赖(请参考“注入攻击”一章),已知已经有若干种方法可以绕过它,甚至由于它的存在反而衍生出一些新的安全问题。XSS、SQL注入等漏洞,都应该由应用在正确的地方解决。同时关闭它还能提高性能。
 
cgi.fix_pathinfo = 0
若PHP以CGI的方式安装,则需要关闭此项,以避免出现文件解析问题(请参考“文件上传漏洞”一章)。
 
session.cookie_httponly = 1  开启HttpOnly
 
session.cookie_secure = 1
若是全站HTTPS则请开启此项。
 
sql.safe_mode = Off
PHP的安全模式是否应该开启的争议一直比较大。一方面,它会影响很多函数;另一方面,它又不停地被黑客们绕过,因此很难取舍。如果是共享环境(比如App Engine),则建议开启safe_mode,可以和disable_functions配合使用;
如果是单独的应用环境,则可以考虑关闭它,更多地依赖于disable_functions控制运行环境安全。
 
disable_functions =
能够在PHP中禁用函数(如上默认=号后面什么都不配置)。这是把双刃剑,禁用函数可能会为开发带来不便,但禁用的函数太少又可能增加开发写出不安全代码的几率,同时为黑客获取webshell提供便利。
一般来说,如果是独立的应用环境,则推荐禁用以下函数:
disable_functions = escapeshellarg, escapeshellcmd, exec,passthru, proc_close, proc_get_status, proc_open, proc_nice,proc_terminate, shell_exec, system, ini_restore, popen, dl,disk_free_space, diskfreespace, set_time_limit, tmpfile, fopen,readfile, fpassthru, fsockopen, mail, ini_alter, highlight_file,openlog, show_source, symlink, apache_child_terminate,apache_get_modules, apache_get_version, apache_getenv,apache_note, apache_setenv, parse_ini_file

php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
曾经遇到的问题:
在网站后台上传图片的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了,连普通的字段都获取不到了,苦思冥想还没解决,最后问了师傅,
师傅看了说挺奇怪的,然后问我 upload_max_filesize的值改了吗,我说改了啊,师傅也解决不了了。过了一会师傅问 post_max_size改了吗,我说那个和上传没关系吧,
师傅没理我,我还是照着自己的想法继续测试,弄了半天还是不行,最后试了师傅提的意见,成功了,原来上传是和 post_max_size有关系的。
  
问题总结 :
php.ini配置文件中的默认文件上传大小为 2M,默认upload_max_filesize = 2M ,即文件上传的大小为 2M,如果你想上传超过8M的文件,比如 20M,
  
必须设定 upload_max_filesize = 20M。但是光设置upload_max_filesize = 20M还是无法实现大文件的上传功能,你必须修改 php.ini配置文件中的post_max_size选项,
其代表允许 POST的数据最大字节长度,默认为 8M。如果POST 数据超出限制,那么 $_POST和$_FILES 将会为空。要上传大文件,
你必须设定该选项值大于 upload_max_filesize指令的值,我一般设定upload_max_filesize和 post_max_size值相等。
另外如果启用了内存限制,那么该值应当小于 memory_limit选项的值。
  
文件上传的其他注意事项 :
在上传大文件时,你会有上传速度慢的感觉,当超过一定的时间,会报脚本执行超过 30秒的错误,这是因为在php.ini配置文件中 max_execution_time 配置选项在作怪,
其表示每个脚本最大允许执行时间 (秒) ,0 表示没有限制。你可以适当调整 max_execution_time的值,不推荐设定为0。
********************************************************************************************************
解释:
具体可查看 PHP手册 中的 〔php.ini 核心配置选项说明〕
upload_max_filesize 所上传的文件的最大大小。
post_max_size       设定 POST 数据所允许的最大大小。
memory_limit        设定了一个脚本所能够申请到的最大内存字节数。
 
一般来说:memory_limit > post_max_size > upload_max_filesize
  
upload_max_filesize是限制本次上传的最大值
post_max_size是post数据的最大值, 通过POST提交数据的最大值
一般我们在php中用的是POST方式上传

------------------------------------------------------------------------------------------------------------------------------------
php.ini中记录PHP错误日志的参数:display_errors与log_errors的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
1)display_errors
错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项。错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利。推荐关闭此选项。
 
display_errors = On
开启状态下,若出现错误,则报错,出现错误提示。即显示所有错误信息。
 
dispaly_errors = Off
关闭状态下,若出现错误,则提示:服务器错误,但是不会出现错误提示。即关闭所有错误信息
 
2)log_errors
在正式环境下用这个就行了,把错误信息记录在日志里。正好可以关闭错误回显。
 
log_errors = On    //注意,log_errors设置为On后,那么dispaly_errors就要设置为Off,这两个不能同时打开。
 
error_log = /Data/logs/php/error.log   //注意,log_errors设置为On时,必须要设置error_log的日志文件路径,并且这个日志文件要能有权限正常写入。
 
也就是说log_errors = On时,必须指定error_log文件,如果没指定或者指定的文件没有权限写入,那么照样会输出到正常的输出渠道,那么也就使得display_errors 这个指定的Off失效,错误信息还是打印了出来。
 
对于PHP开发人员来说,一旦项目上线后,第一件事就是应该将display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。
 
---------------------------------------------------
一般说来:
 
测试环境下的php.ini中的错误日志设置:             
error_reporting = E_ALL 
display_errors = On 
html_errors = On 
log_errors = Off 
 
正式环境下的php.ini中的错误日志设置:
error_reporting = E_ALL &~ E_NOTICE &~ E_WARNING       //注意这个设置,记得有一次因为这个设置有误,导致了线上一个业务访问出现了nginx 500报错!这个导致了php框架报错! 
display_errors = Off 
log_errors = On 
html_errors = Off 
error_log = /Data/logs/php/error.log
ignore_repeated_errors = On 
ignore_repeated_source = On 
 
简单讲解下各个配置的意义:
error_reporting :设置报告哪些错误 
display_errors :设置错误是否作为输出的一部分显示 
html_errors :设置错误信息是否采用html格式 
log_errors :设置是否记录错误信息 
error_log :设置错误信息记录的文件 
ignore_repeated_errors :是否在同一行中重复显示一样的错误信息 
ignore_repeated_source : 是否重复显示来自同个文件同行代码的错误
原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/8780065.html