zoukankan      html  css  js  c++  java
  • 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 : 是否重复显示来自同个文件同行代码的错误
  • 相关阅读:
    Socket 的网络编程
    《Python 3.5从零开始学》笔记-第8章 面向对象编程
    Python 的8个关键要素
    分布式发布订阅模型网络的实现有哪些
    MongoDB知识整理
    C++模板类与Qt信号槽混用
    C++中 =default,=delete用法
    QT知识整理
    Python题整理
    STL库的应用
  • 原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/8780065.html
Copyright © 2011-2022 走看看