1. 配置PHP错误日志记录
确保PHP将错误信息记录到专用日志文件而非直接显示在页面上,降低敏感信息泄露风险。修改php.ini文件(路径根据PHP版本和Web服务器类型调整,如Apache为/etc/php/8.2/apache2/php.ini,PHP-FPM为/etc/php/8.2/fpm/php.ini),设置以下关键参数:
display_errors = Off:禁止在浏览器中显示错误详情;log_errors = On:启用错误日志记录;error_log = /var/log/php_errors.log:指定专用日志文件路径;error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED:设置合理的错误报告级别(生产环境建议屏蔽Notice和Deprecated级别信息)。修改后重启Web服务(Apache用systemctl restart apache2,PHP-FPM用systemctl restart php8.2-fpm)使配置生效。2. 强化日志文件权限管理
确保日志文件仅能被授权用户(如Web服务器进程用户www-data)访问,防止未授权读取。执行以下命令:
sudo touch /var/log/php_errors.log # 创建日志文件(若不存在)
sudo chown www-data:www-data /var/log/php_errors.log # 设置所有者为用户:组(www-data为Apache/Nginx默认用户)
sudo chmod 640 /var/log/php_errors.log # 设置权限(所有者可读写,组可读,其他用户无权限)
定期检查日志文件权限,避免因误操作导致权限放宽。
3. 使用logrotate定期轮转日志
避免日志文件无限增长占用磁盘空间,同时防止旧日志被恶意篡改。创建或编辑/etc/logrotate.d/php文件,添加以下配置:
/var/log/php_errors.log {
daily # 每天轮转一次
missingok # 若日志文件不存在也不报错
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(节省空间)
notifempty # 若日志为空则不轮转
create 640 www-data adm # 轮转后创建新日志文件并设置权限
}
logrotate会自动按配置处理日志,无需手动干预。
4. 屏蔽PHP版本及敏感信息
防止通过HTTP响应头或错误信息泄露PHP版本、服务器路径等敏感信息,减少攻击面。在php.ini中设置:
expose_php = Off:关闭PHP版本信息的HTTP头输出(如X-Powered-By: PHP/8.2.0);/var/www/html/config.php),可通过error_reporting限制错误级别,仅记录必要信息。5. 限制PHP访问范围
通过open_basedir参数限制PHP脚本只能访问指定目录(如网站根目录和临时目录),防止非法访问系统敏感文件(如/etc/passwd)。在php.ini或虚拟主机配置中添加:
open_basedir = /var/www/html:/tmp/
注意:多个目录用冒号分隔,路径需根据实际网站目录调整。
6. 禁用危险函数与远程资源访问
关闭可能被用于执行恶意代码的危险函数,以及禁止通过URL访问远程资源,降低代码注入风险。在php.ini中设置:
disable_functions = exec,passthru,shell_exec,system:禁用exec、passthru等系统函数;allow_url_fopen = Off:禁止通过file_get_contents()等函数访问远程URL;allow_url_include = Off:禁止通过include或require包含远程文件。7. 监控与审计日志
定期检查PHP日志文件(如/var/log/php_errors.log),使用工具(如tail -f实时监控、grep过滤关键字)识别异常(如大量SQL错误、文件包含尝试)。结合集中式日志管理工具(如ELK、Graylog)实现日志的集中存储、分析和报警,及时发现潜在攻击。