php安全配置记录和常见错误梳理(总结)

时间:2017-04-08

通常部署完php环境后会进行一些安全设置,除了熟悉各种php漏洞外,还可以通过配置php.ini来加固PHP的运行环境,PHP官方也曾经多次修改php.ini的默认设置。

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

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两个选项

曾经遇到的问题: 
在网站后台上传图片的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了,连普通的字段都获取不到了,苦思冥想还没解决,最后问了师傅, 
师傅看了说挺奇怪的,然后问我 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方式上传
  • 共4页:
  • 上一篇1/4
  • 下一页
  • 上一篇:谈谈从phpinfo中能获取哪些值得注意的信息 下一篇:php实现留言板功能(代码详解)

    相关文章

    最新文章