如何启用PHP安全模式以增强网站安全性:详细指南与步骤
随着越来越多的用户使用PHP环境,相关的安全问题变得越来越重要。 PHP环境提供的安全模式是一个非常重要的内置安全机制。 PHP安全模式可以有效控制PHP环境中的一些函数(如system()函数),控制大多数文件操作函数的权限,并且不允许对某些关键文件(如/etc/passwd)进行修改。但是,默认的 php.ini 配置文件不启用安全模式。

本文档介绍了如何使用 PHP 的安全模式功能来保护您网站的安全。
1.启用PHP安全模式
PHP环境提供的安全模式是一个非常重要的内置安全机制。 PHP安全模式可以有效控制PHP环境中的一些函数(如system()函数),控制大多数文件操作函数的权限,并且不允许对某些关键文件(如/etc/passwd)进行修改。但是,默认的 php.ini 配置文件不启用安全模式。
可以通过修改php.ini配置文件来启用PHP安全模式:
safe_mode = on
2、用户组安全
当启用安全模式时,如果关闭 safe_mode_gid 选项,PHP 脚本可以访问该文件,同一用户组中的用户也可以访问该文件。
因此,建议您将此选项设置为关闭:
safe_mode_gid = off
注意:该选项参数仅适用于Linux操作系统。
如果不设置此设置,您可能无法操作服务器网站目录中的文件。
3.安全模式下执行程序主目录
如果启用安全模式并想执行某些程序,可以指定需要执行程序的主目录,例如:
safe_mode_exec_dir =/usr/bin
一般情况下,如果不需要执行任何程序,建议不要指定执行系统程序的目录。可以指定一个目录,然后将要执行的程序复制到该目录下,例如:
safe_mode_exec_dir =/temp/cmd
但是,建议您不要执行任何程序。这种情况下,只需将执行目录指向网页目录即可:
safe_mode_exec_dir =/usr/www
注:执行目录路径以您实际操作系统的目录路径为准。
4. 在安全模式下包含文件
如果需要在安全模式下包含某些公共文件,只需要修改以下选项:
safe_mode_include_dir =/usr/www/include/
一般PHP脚本包含的文件都已经写在程序中了,可以根据自己的具体需要进行设置。
5.控制PHP脚本可以访问的目录
使用open_basedir选项可以控制PHP脚本只访问指定的目录。这样可以防止PHP脚本访问不应该访问的文件,在一定程度上减少phpshell的危害。一般情况下可以设置只访问网站目录:
open_basedir =/usr/www
6.关闭危险功能
如果开启安全模式,则无需设置功能禁止,但出于安全考虑,建议您进行相关设置。例如,如果你不想执行包括system()等执行命令的PHP函数,以及phpinfo()等可以查看PHP信息的函数,你可以通过以下设置禁止这些函数:
disable_functions = system, passthru,exec, shell_exec, popen, phpinfo, escapeshellarg, escapeshellcmd, proc_close, proc_open, dl
如果你想禁止对任何文件和目录的操作,可以关闭以下与文件相关的操作。
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威胁。
7、关闭HTTP header中PHP版本信息的泄露
为了防止黑客获取服务器上的 PHP 版本信息,可以防止此信息在 HTTP 标头中泄露:
expose_php = off
设置完成后,黑客在执行 telnet 80 并尝试连接到您的服务器时将无法看到 PHP 版本信息。
8.关闭全局变量的注册
PHP环境中提交的变量,包括使用POST或GET命令提交的变量,都会自动注册为全局变量,可以直接访问。这对于你的服务器来说是非常不安全的,所以建议你关闭注册全局变量的选项,并禁止将提交的变量注册为全局变量。
register_globals = off
注意:该选项参数在 PHP 5.3 及更高版本中已被删除。
当然,如果这样设置的话,就需要用合理的方法来获取相应的变量。例如,要获取GET命令提交的变量var,需要使用$_GET['var']命令来获取。设计PHP程序时需要注意这一点。
9. SQL注入防护
SQL注入是一个非常危险的问题,可能会导致网站后端被入侵,甚至导致整个服务器崩溃。
magic_quotes_gpc 选项默认关闭。如果打开该选项,PHP会自动转换用户提交的SQL查询请求(例如将'转换为\'等),这对于防止SQL注入攻击非常有效,所以建议您设置此项选项:
magic_quotes_gpc = on
注意:该选项参数在 PHP 5.4.0 及更高版本中已被删除。
10.错误信息控制
一般PHP环境在未连接数据库或者其他情况下会出现错误信息。错误消息可能包括PHP脚本或查询的SQL语句的当前路径信息。此类信息如果暴露给黑客并不安全,因此建议您禁用此错误消息:
display_errors =Off
如果您确实想显示错误消息,请务必设置错误消息的显示级别。例如,仅在警告上方显示错误消息:
error_reporting = E_WARNING & E_ERROR
注意:强烈建议您关闭错误消息。
11. 错误日志
建议您关闭错误信息后记录错误信息,方便排查服务器运行异常的原因:
log_errors =On
同时需要设置错误日志的存放目录。建议您将PHP错误日志和Apache日志存放在同一目录中:
error_log =/usr/local/apache2/logs/php_error.log
注意:该文件必须设置为允许Apache用户或用户组具有写入权限。