钧言极客

PHP环境安全配置php.ini

在新编译PHP环境中,php.ini文件都没有完全设置了安全机制,需要自己对修改配置文件php.ini对安全产生威胁的一些函数或者没用模块进行禁用或者关闭。只有重视网络安全问题,设立有效的安全防御,才能更好保障用户的体验和服务的稳定性。

软件版本

PHP版本应该与官方的最新版本保持一致,最新版本修复了BUG,注意不建议使用beta版本。

推荐在PHP的官网下载:http://www.php.net/downloads.php

启用PHP安全模式

PHP 环境提供的安全模式是一个非常重要的内嵌安全机制,PHP 安全模式能有效控制一些 PHP 环境中的函数(例如system()函数),对大部分的文件操作函数进行权限控制,同时不允许对某些关键文件进行修改(例如 /etc/passwd)。 PHP5.4以后的版本,安全模式已经被弃用,这里随笔记录一下

safe_mode = on

安全模式下执行程序主目录

如果启用了安全模式后,想要执行某些程序的时候,可以指定需要执行程序的主目录,例如:

safe_mode_exec_dir = /usr/bin

一般情况下,如果不需要执行什么程序,建议您不要指定执行系统程序的目录。您可以指定一个目录,然后把需要执行的程序拷贝到这个目录即可,例如:

safe_mode_exec_dir = /temp/cmd

但是,更推荐您不要执行任何程序。这种情况下,只需要将执行目录指向网页目录即可:

safe_mode_exec_dir = /usr/www

注意:执行目录的路径以您实际操作系统目录路径为准。

安全模式下包含文件

如果您需要在安全模式下包含某些公共文件,您只需要修改以下选项即可:

safe_mode_include_dir = /usr/www/include/

一般情况下,PHP 脚本中包含的文件都是在程序已经写好的,可以根据您的具体需要进行设置。

控制 PHP 脚本能访问的目录

使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免 PHP 脚本访问不应该访问的文件,一定程度下降低了phpshell的危害。一般情况下,可以设置为只能访问网站目录:

open_basedir = /usr/www

禁用使用PHP危险函数

如果您启用了安全模式,那么可以不需要设置函数禁止,但为了安全考虑。例如,您不希望执行包括system()等在内的执行命令的PHP函数,以及能够查看PHP信息的phpinfo()等函数,那么您可以通过以下设置禁止这些函数:

函数名称函数功能危险级别
chgrp()改变文件或目录所属的用户组
chown()改变文件或目录的所有者
chroot()可改变当前进程的工作根目录,仅当系统支持CLI模式时PHP才能工作,且该函数不适用于Windows系统
dl()在PHP运行过程当中(而非启动时)加载一个PHP外部模块
exec()允许执行一个外部程序(如UNIX Shell或CMD命令等)
ini_alter()时ini_set()函数的一个别名函数,功能与ini_set()相同
ini_restore()可用于将PHP环境配置参数恢复为初始值
ini_set()可用于修改、设置PHP环境配置参数
passthru()允许执行一个外部程序并回显输出,类似于exec()
pfsockopen()建立一个Internet或UNIX域的socket持久连接
phpinfo()输出PHP环境信息以及相关的模块、web环境等信息
popen()可通过popen()的参数传递一条命令,并对popen()所打开的文件进行执行
proc_get_status()获取使用proc_open()所打开进程的信息
proc_open()执行一个命令并打开文件指针用于读取以及写入
putenv()用于在PHP运行时改变系统字符集环境。在低于5.2.6版本的PHP中,可利用该函数。修改系统字符集环境后,利用sendmail指令发送特殊参数执行系统Shell命令
shell_exec()可通过Shell执行命令,并将执行结果作为字符串返回
symlink()对已有的target建立一个名为link的符号链接
system()允许执行一个外部程序并回显输出,类型于passthru()
readlink()返回符号连接指向的目标文件内容
scandir()列出指定路径中的文件和目录
stream_socket_server()建立一个Internet或UNIX服务器连接
syslog()可调用UNIX系统的系统层syslog()函数
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo,escapeshellarg,escapeshellcmd,proc_close,proc_open,dl
disable_functions = eval,passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,disk_total_space,disk_free_space,error_log,putenv,popen,ini_set,chmod,assert,pcntl_exec,phpfunc;

如果您想要禁止对于任何文件和目录的操作,那么您可以关闭以下文件相关操作。

disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy, mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown

注意: 以上设置中只列举了部分比较常用的文件处理函数,您也可以将上面的执行命令函数和这些文件处理函数相结合,就能给抵制大部分的 phpshell 威胁。

用户组安全

启用安全模式后,如果safe_mode_gid选项被关闭,PHP 脚本能够对文件进行访问,且相同用户组的用户也能够对该文件进行访问。

safe_mode_gid = off

禁用运程执行代码

通过file_get_content或者fopen函数,可以从远程获取数据,如果使用不当,没有对返回数据进行过滤,此方法就会造成安全漏洞。要解决此问题,可以禁用allow_url_fopen配置项:

allow_url_fopen=Off

除了这个,还建议禁用allow_url_include配置下以提高系统的安全性:

allow_url_include=Off

关闭PHP版本HTTP头信息泄露

默认PHP在HTTP Response Header中会添加版本号声明(X-Powered-By),为了防止获取服务器中PHP版本的信息,您可以禁止该信息在HTTP头部内容中泄露:

expose_php = off

这样设置之后,在执行telnet 80尝试连接您的服务器的时候,将无法看到 PHP 的版本信息。

错误信息控制和错误日志

一般 PHP 环境在没有连接到数据库或者其他情况下会有错误提示信息,错误信息中可能包含 PHP 脚本当前的路径信息或者查询的 SQL 语句等信息,这类信息如果暴露给黑客是不安全的,因此建议您禁止该错误提示:

;生产环境下,设定为Off
display_errors = Off

;开启错误日志记录
log_errors = On

;指定日志写入路径
error_log=/var/log/php/error_log.log

资源限制优化

为了提高系统的稳定性,强烈建议设置每个脚本解析请求数据所花费的时间和脚本可能消耗的最大内存量。正确的配置这些参数可以防止PHP任何脚本消耗太多的资源或是内存,从而避免系统不安全或降低安全系数。

# 每个脚本最大执行时间,0 表示不限制。
max_execution_time = 30
# 每个脚本等待解析时间,-1 表示不限制。
max_input_time = 30
# 每个脚本最大消耗内存,-1 表示不限制。
memory_limit = 40M
# 上传文件最大许可大小
upload_max_filesiz = 50M;

Cookie安全

Cookie 的 HttpOnly

HttpOnly可以让Cookie在浏览器中不可见,开启HttpOnly可以防止JavaScript脚本通过document对象获取 Cookie

;开启 HttpOnly
session.cookie_httponly=On
Cookie 的 Secure

如果web传输协议使用的是HTTPS,则应开启cookie_secure,当Secure属性设置为true时,Cookie只有在HTTPS下才能上传到服务器,防止Cookie被窃取

session.cookie_secure=On

减少PHP无用模块

减少PHP中不常用的模块,来达到增强性能和安全性,可以通过命令来查看安装模块

php -m

一些没有用的内置模块,可以通过修改PHP配置文件,将相对应的模块注释掉

;extension=sqlite3

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »