修复方案:禁止向用户显示错误信息,改为记录到日志文件
问题:
- 网站直接向用户返回 详细错误信息(如数据库错误、堆栈跟踪),可能泄露敏感信息(如 SQL 结构、文件路径、API 密钥)。
- 攻击者可利用这些信息进行针对性攻击(如 SQL 注入、路径遍历)。
解决方案:
- 关闭前端错误显示,改为返回通用错误页面(如
500 Internal Server Error
)。 - 将详细错误记录到日志文件,供管理员排查问题。
1. 禁用前端错误显示
(1)PHP(关闭 display_errors
)
修改 php.ini
:
display_errors = Off ; 禁止前端显示错误
log_errors = On ; 启用错误日志
error_log = /var/log/php_errors.log ; 指定日志路径
或在代码中动态设置:
ini_set('display_errors', 0); // 关闭错误显示
ini_set('log_errors', 1); // 开启日志记录
ini_set('error_log', '/var/log/php_errors.log');
(2)Python(Django/Flask)
Django(settings.py
)
DEBUG = False # 必须关闭调试模式
ALLOWED_HOSTS = ['your-domain.com'] # 限制合法域名
# 自定义错误页面
handler500 = 'app.views.custom_500_view'
Flask
app = Flask(__name__)
app.config['DEBUG'] = False # 关闭调试模式
# 日志配置
import logging
logging.basicConfig(filename='/var/log/flask_errors.log', level=logging.ERROR)
(3)Node.js(Express)
app.use((err, req, res, next) => {
// 记录错误到文件
const fs = require('fs');
fs.appendFileSync('/var/log/node_errors.log', err.stack);
// 返回通用错误页面
res.status(500).send('Internal Server Error');
});
(4)Java(Spring Boot)
# application.yml
server:
error:
include-stacktrace: never # 不返回堆栈信息
path: /error # 自定义错误页面路径
logging:
file:
path: /var/log/spring.log
2. 配置日志记录
(1)日志文件权限
确保日志目录不可通过 Web 访问:
chmod 750 /var/log/app_errors.log
chown www-data:adm /var/log/app_errors.log # Nginx/Apache 用户组
(2)日志轮转(防止爆满)
Linux(logrotate)
创建 /etc/logrotate.d/your-app
:
/var/log/app_errors.log {
daily
rotate 30
compress
missingok
notifempty
create 640 www-data adm
}
3. 验证修复是否生效
(1)触发错误,检查前端响应
- 预期:返回 通用错误页面(如
500.html
),无敏感信息。 - 测试方法:
预期输出:curl -i http://example.com/invalid-page
HTTP/1.1 500 Internal Server Error Content-Type: text/html <!DOCTYPE html><html>...(无堆栈信息)...</html>
(2)检查日志文件
tail -f /var/log/app_errors.log
预期输出:
[2023-01-01 12:00:00] ERROR: Database connection failed at /app/models/db.py:42
4. 额外加固建议
✅ 监控日志:使用工具(如 fail2ban
)自动报警异常错误。
✅ 定期审计:检查日志中是否包含攻击尝试(如 SQL 注入 payload)。
✅ 自定义错误页面:
- 设计友好的
4xx.html
和5xx.html
页面,避免暴露技术细节。
📌 总结
- 关闭前端错误显示(
display_errors=Off
/DEBUG=False
)。 - 记录错误到安全路径(限制权限,避免泄露)。
- 验证:确保用户仅看到通用错误,详细信息写入日志。
修复后,攻击者无法通过错误信息获取系统内部细节,大幅降低风险! 🔒