PHP安全配置总结
# 1. 减少PHP模块
为了增强性能和安全性,建议减少PHP中的模块,通过以下命令可以查看安装的模块:
php –m
一些无用的内置模块,可以通过修改PHP配置文件(php.ini),将相应模块注释掉即可,例如sqlite3:
;extension=sqlite3
# 2. 隐藏PHP版本信息
默认PHP在HTTP Response Header中会添加版本号声明(X-Powered-By),这为攻击者提供了一个非常有价值的信息:
HTTP/1.1 200 OK
Server: openresty
Date: Sun, 06 Oct 2019 07:44:12 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/7.3.6
Content-Encoding: gzip
2
3
4
5
6
7
8
9
可以禁用expose_php配置项隐藏X-Powered-By信息:
expose_php = Off
# 3. 禁用远程执行代码
通过file_get_content或者fopen函数,可以从远程获取数据,如果使用不当,没有对返回数据进行过滤,此方法就会造成安全漏洞。要解决此问题,可以禁用allow_url_fopen配置项:
allow_url_fopen=Off
除了这个,还建议禁用allow_url_include配置下以提高系统的安全性:
allow_url_include=Off
# 4. 禁用PHP中的危险函数
PHP中有很多危险的内置功能,如果使用不当,可能使系统崩溃,可以通过disable_functions配置项来禁用它。
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
# 5. 资源控制
为了提高系统的稳定性,强烈建议设置每个脚本解析请求数据所花费的时间和脚本可能消耗的最大内存量。正确的配置这些参数可以防止PHP任何脚本消耗太多的资源或是内存,从而避免系统不安全或降低安全系数。
max_execution_time = 30
max_input_time = 30
memory_limit = 40M
2
3
# 6. 限制PHP访问文件系统
open_basedir配置项可以指定允许PHP访问的目录,如果任何脚本试图访问超出open_basdir定义的路径文件,PHP将拒绝打开,配置参考如下:
open_basedir = "/www/websites/www/gitlib/"
# 7. 限制文件/目录访问
对于PHP-FPM进程以非root用户运行,比如www-data,同样对于Web资源目录和文件也要属于非root用户,可以通过修改所有者访问权限,提升安全性:
chown -R www-data:www-data /www/websites/www/gitlib/
# 8. 禁用全局变量自动注册
PHP会根据register_globals配置项,判断是否将$_GET、$_POST、$_COOKIE、$_ENV、$_SERVER、$REQUEST等数组变量里的内容自动注册为全局变量,为了避免造成变量污染引发安全漏洞,这个配置项一般都禁用掉。
register_globals = Off
PHP 4.2.0 版开始配置文件中 register_globals 的默认值从 on 改为 off,这一项在新版本中可以无视。