介绍
Php默认很多选项是不安全的,给攻击者留下了很多利用的机会。
Php.ini中分号开头行为注释行,配置大都为“指令名=值”的形式,这里需要注意的是php.ini对指令名大小写敏感,a=aaa和A=aaa是不一样的。而php.ini中的值可以是字符串、数字、php常量、ini常量、表达式等。配置文件分了很多部分,例如模块部分、php全局配置、数据库配置等。
安全参数
以下有些参数设置在php高版本中已被移除,低版本存在,有些服务器使用的php版本依然是老版本没有升级,则建议进行以下参数配置。
第一个参数register_globals,它会影响php如何接受传递过来的参数,其作用是注册为全局变量,开启后,传递来的参数会被注册为全局变量直接使用。此参数建议关闭,现在基本默认都是关闭的,而且新版本已经没有这个选项了,低版本存在会开启。
第二个参数magic_quotes_gpc,开启此参数后,$_POST、$_GET、$_COOKIE接受到的单引号、双引号、反斜杠、空字符会加上\符号进行转义,可提高安全性,建议开启。这个选项高版本也没有了。
第三个参数display_errors,此参数用来定位错误,错误信息会泄露程序、服务器、数据库等敏感信息,有利益攻击者信息搜集,建议关闭。(测试环境可开启,方便调试)
这里echo一个字符不加分号,display_errors为on时会报错提示错误及代码行数等信息,将display_errors设置为off时,页面不会打印错误信息,如下图。
第四个参数safe_mode,安全模式,开启后能够控制php中的一些函数,例如system,同时对很多文件操作函数进行了权限控制,且不允许对关键文件进行操作,例如/etc/passwd。此模式默认关闭,需要设置safe_mode=on开启。这个模式在高版本中也被移除。
第五个参数open_basedir,其可以控制php能访问哪些目录,避免php脚本访问不该访问的文件,一定程度上可降低webshell的危害,一般设置为只能访问网站目录,例如open_basedir=d:/www.
在没有配置前,getshell后是可以访问其他盘的,配置后无法访问其他盘,项目所在的盘访问不允许的文件会提示被禁止,如下图。
第六个参数是disable_functions,这个配置会限制一些对系统危害比较大的函数,例如phpinfo、system、exec等,这里注意的是这些函数并不是默认限制的,具体限制哪些需要手动配置。建议限制以下函数:
disable_functions=phpinfo、passthru、exec、system、chroot、scandir、chgrp、chown、shell_exec、proc_Open、proc_get_status、ini_alter、ini_restore、dl、pfsockopen、openlog、syslog、readlink、symlink、popepassthru、stream_socket_server.
这是运行phpinfo文件会提示由于安全被禁用,如下图。
这里需要注意的是,eval函数不能通过disable_functions禁用,因为eval不属于php函数,它属于zend,要想禁用可以引入Suhosinc插件进行配置,这里不记录感兴趣可以去搜索相关内容。
第七个参数是com组件,当com.allow_dcom配置为true时,php允许使用com函数来创建系统组件以此来运行系统命令,建议将其设置为false。
第八个参数是expose_php,此参数决定是否暴漏php的版本,默认为on,建议设置为off。
总结
建议线上环境设置以上参数,提高网站运行的安全环境。