PHP安全模式用来限制用户使用外部命令或执行不安全的操作,这种配置多用在保密级别高的服务器、云主机或虚拟主机等多用户环境中。
打开或者关闭安全模式,需打开php.ini中的safe_mode选项即可:
safe_mode = on
修改完成,重启Apache或Nginx后即可生效。这样在执行或试图要打开外部文件时,PHP会审核所有者和其本身所有者是否匹配,防止越权执行或修改。
启用安全模式会对PHP本身的行为产生影响,限制函数的功能以及禁用部分函数。以下函数会受到影响:
chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,highlight_file,show_source,include,symlink,link,touch,mkdir,unlink,putenv,set_time_limit,set_include_path。
这些函数大多数与文件、目录及系统相关,此外dl()这个动态加载扩展库函数功能也会被禁止执行。如果要加载外部扩展库,需要在php.ini文件中添加相应库,使其在运行环境时加载进来。
当安全模式开启,要在PHP脚本中执行外部程序时,需在php.ini中的safe_mode_exec_dir选项指定外部程序的所在目录,否则会无法执行,同时也会自动传递给escapeshellcmd()函数进行过滤。
一些外部命令执行函数也会受影响,包括exec,shell_exec,passthru,system,popen,以及外部命令执行操作符(``)。
当脚本在访问文件系统时会进行所有者检查。默认情况会检查该文件所有者的用户组id,用户组id(gid)在safe_mode_gid选项中指定。
若要在安全模式下脚本中使用include或require包含,需用safe_mode_include_dir选项来设置包含文件所在的路径,以保证代码正常工作。例如,包含/usr/local/include/php下的文件,可以设置选项为:
safe_mode_include_dir = /usr/local/include/php
如果在脚本中运行外部命令,需要修改php.ini里的safe_mode_exec_dir参数,例如想要执行/usr/local/php-bin路径下的文件,可以改成:
safe_mode_exec_dir = /usr/local/php-bin
如果想修改某些系统环境变量,可使用safe_mode_allowed_env_vars选项。这个选项的值是一个环境变量的前缀,默认允许php_开头的环境变量,如果想要修改,可以设置该选项的值,多个环境变量之间使用逗号分隔。