本文目录导读:

PHP配置审计是Web安全中非常重要的一环,以下是针对PHP配置审计的详细指南,包含关键配置项、安全风险及审计方法。
核心配置文件审计
主要配置文件路径
# 常见位置 /etc/php.ini /etc/php/7.4/apache2/php.ini /etc/php/7.4/fpm/php.ini /usr/local/php/etc/php.ini
关键安全配置项审计清单
; ========== 危险函数禁用 ========== ; 必须禁用的危险函数 disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,highlight_file,escapeshellarg,escapeshellcmd ; ========== 错误信息控制 ========== ; 生产环境必须关闭 display_errors = Off display_startup_errors = Off ; 记录错误但不显示 log_errors = On error_log = /var/log/php_errors.log ; ========== 资源限制 ========== max_execution_time = 30 ; 最大执行时间 max_input_time = 60 ; 最大输入时间 memory_limit = 128M ; 内存限制 post_max_size = 8M ; POST数据限制 upload_max_filesize = 2M ; 上传文件大小 ; ========== 文件操作安全 ========== allow_url_fopen = Off ; 禁用远程文件包含 allow_url_include = Off ; 禁用远程文件包含 open_basedir = /var/www/html:/tmp ; 限制文件访问范围 ; ========== 会话安全 ========== session.use_strict_mode = 1 ; 严格会话模式 session.use_cookies = 1 ; 使用Cookie session.use_only_cookies = 1 ; 仅使用Cookie session.cookie_httponly = 1 ; 禁止JavaScript访问 session.cookie_secure = 1 ; 仅HTTPS传输 session.cookie_samesite = "Lax" ; 防止CSRF ; ========== 全局变量 ========== register_globals = Off ; PHP 5.4+已移除 magic_quotes_gpc = Off ; PHP 5.4+已移除 ; ========== 上传安全 ========== file_uploads = On upload_tmp_dir = /tmp/php_uploads ; 必须配置
PHP-FPM配置审计
FPM池配置
; /etc/php/7.4/fpm/pool.d/www.conf ; 以最小权限运行 user = www-data group = www-data ; 限制PHP进程能打开的连接 listen.allowed_clients = 127.0.0.1 ; 进程管理 pm.max_children = 50 ; 最大子进程数 pm.start_servers = 5 ; 启动服务器数 pm.min_spare_servers = 5 ; 最小空闲服务器数 pm.max_spare_servers = 35 ; 最大空闲服务器数 ; 请求终止设置 request_terminate_timeout = 60s request_slowlog_timeout = 5s slowlog = /var/log/php-slow.log
安全审计脚本示例
<?php
/**
* PHP配置安全审计脚本
* 用于检测常见的安全配置问题
*/
class PHPConfigAuditor {
private $criticalSettings = [];
private $warnings = [];
public function checkSecurityConfig() {
// 1. 危险函数检查
$dangerousFunctions = ini_get('disable_functions');
$this->criticalSettings['disable_functions'] = $dangerousFunctions;
// 2. 错误显示检查
$this->criticalSettings['display_errors'] = ini_get('display_errors');
// 3. 远程文件包含检查
$this->criticalSettings['allow_url_fopen'] = ini_get('allow_url_fopen');
$this->criticalSettings['allow_url_include'] = ini_get('allow_url_include');
// 4. 资源限制检查
$this->criticalSettings['max_execution_time'] = ini_get('max_execution_time');
$this->criticalSettings['memory_limit'] = ini_get('memory_limit');
// 5. 文件包含路径限制
$this->criticalSettings['open_basedir'] = ini_get('open_basedir');
// 6. 会话安全
$this->criticalSettings['session.cookie_httponly'] = ini_get('session.cookie_httponly');
$this->criticalSettings['session.cookie_secure'] = ini_get('session.cookie_secure');
}
public function analyze() {
$issues = [];
// 分析危险函数
$safeFunctions = ['exec', 'system', 'passthru', 'shell_exec', 'proc_open'];
foreach ($safeFunctions as $func) {
if (strpos($this->criticalSettings['disable_functions'], $func) === false) {
$issues[] = "⚠️ 危险函数 {$func} 未禁用";
}
}
// 分析错误显示
if ($this->criticalSettings['display_errors'] !== 'Off' &&
$this->criticalSettings['display_errors'] !== '0') {
$issues[] = "❌ display_errors 未关闭 (当前: {$this->criticalSettings['display_errors']})";
}
// 分析远程文件包含
if ($this->criticalSettings['allow_url_fopen'] === 'On' ||
$this->criticalSettings['allow_url_fopen'] === '1') {
$issues[] = "❌ allow_url_fopen 处于开启状态";
}
// 分析open_basedir
if (empty($this->criticalSettings['open_basedir'])) {
$issues[] = "❌ open_basedir 未配置";
}
// 分析会话安全
if ($this->criticalSettings['session.cookie_httponly'] !== '1') {
$issues[] = "⚠️ session.cookie_httponly 未启用";
}
return $issues;
}
}
// 使用示例
$auditor = new PHPConfigAuditor();
$auditor->checkSecurityConfig();
$issues = $auditor->analyze();
echo "=== PHP 配置安全审计报告 ===\n";
foreach ($issues as $issue) {
echo $issue . "\n";
}
自动化审计脚本
Shell审计脚本
#!/bin/bash
# php_config_audit.sh
# PHP配置安全审计脚本
PHP_INI="/etc/php/7.4/apache2/php.ini"
echo "=============================="
echo "PHP 配置安全审计报告"
echo "=============================="
# 1. 危险函数检查
echo "\n[1] 危险函数检查:"
for func in "exec" "system" "passthru" "shell_exec" "proc_open"; do
if grep -q "^disable_functions.*$func" $PHP_INI; then
echo "✓ $func 已禁用"
else
echo "✗ $func 未禁用"
fi
done
# 2. 错误显示检查
echo "\n[2] 错误显示设置:"
display_errors=$(grep "^display_errors" $PHP_INI | awk '{print $3}')
if [ "$display_errors" = "Off" ]; then
echo "✓ display_errors 已关闭"
else
echo "✗ display_errors 未关闭 (当前: $display_errors)"
fi
# 3. 远程文件包含检查
echo "\n[3] 远程文件包含检查:"
allow_url_fopen=$(grep "^allow_url_fopen" $PHP_INI | awk '{print $3}')
if [ "$allow_url_fopen" = "Off" ]; then
echo "✓ allow_url_fopen 已关闭"
else
echo "✗ allow_url_fopen 未关闭"
fi
# 4. 文件访问限制
echo "\n[4] 文件访问限制:"
open_basedir=$(grep "^open_basedir" $PHP_INI)
if [ -n "$open_basedir" ]; then
echo "✓ open_basedir 已配置: $open_basedir"
else
echo "✗ open_basedir 未配置"
fi
# 5. PHP版本检查
echo "\n[5] PHP版本:"
php_version=$(php -v | head -n 1)
echo "当前版本: $php_version"
Python审计脚本
#!/usr/bin/python3
# php_config_audit.py
import re
def audit_php_config(config_path):
"""审计PHP配置文件"""
with open(config_path, 'r') as f:
config_content = f.read()
# 危险配置正则
patterns = {
'危险函数未禁用': r'disable_functions\s*=\s*(?![^;]*(?:exec|system|passthru))',
'错误显示开启': r'display_errors\s*=\s*On',
'远程文件包含开启': r'allow_url_fopen\s*=\s*On',
'文件包含限制未设置': r'(?:^|\n)open_basedir\s*=\s*(?:\n|;)',
'会话Cookie非HttpOnly': r'session\.cookie_httponly\s*=\s*0',
}
issues = []
for issue_name, pattern in patterns.items():
if re.search(pattern, config_content, re.MULTILINE):
issues.append(f"⚠️ {issue_name}")
return issues
# 使用
issues = audit_php_config('/etc/php/7.4/apache2/php.ini')
for issue in issues:
print(issue)
配置加固建议
生产环境最小化配置
; 必须关闭 display_errors = Off display_startup_errors = Off expose_php = Off ; 必须禁用危险函数 disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source ; 文件包含限制 allow_url_fopen = Off allow_url_include = Off open_basedir = /var/www/html:/tmp ; 会话安全 session.use_strict_mode = 1 session.cookie_httponly = 1 session.cookie_secure = 1 session.use_only_cookies = 1
定期审计检查清单
每周/每月自动化审计项目:
- [ ] 危险函数配置
- [ ] 错误报告设置
- [ ] 文件包含配置
- [ ] 文件访问限制
- [ ] 会话安全配置
- [ ] 资源限制配置
- [ ] PHP版本更新
- [ ] FPM进程配置
常见问题与解决方案
配置冲突问题
# 查看实际生效配置 php -i | grep "Configuration File" php -i | grep "Scan this dir for additional .ini files" # 查看所有加载的配置文件 php --ini
配置变更生效
# Apache sudo systemctl restart apache2 # Nginx + PHP-FPM sudo systemctl restart php7.4-fpm sudo systemctl restart nginx
通过以上审计方法和工具,可以全面检查PHP配置的安全性,建议建立定期的配置审计机制,并关注PHP官方安全公告以获取最新的安全配置建议。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播