安全配置
本指南介绍逍遥图库系统的安全配置和最佳实践。
安全评级
逍遥图库系统经过全面安全加强,达到 A+ 级企业安全标准。
| 安全项目 | 评级 | 说明 |
|---|---|---|
| SSL/TLS | A+ | TLS 1.2/1.3,强加密套件 |
| 安全响应头 | A+ | CSP、HSTS、X-Frame-Options 等 |
| 文件保护 | A+ | 15+ 种敏感文件类型保护 |
| 上传安全 | A+ | 6 层安全验证 |
| 权限管理 | A+ | RBAC 角色权限控制 |
可配置安全设置
v1.1.0 新增
安全设置现在可以在管理后台在线配置,无需修改代码文件。所有安全功能默认关闭,可根据需要开启。
访问频率限制
在管理后台 → 系统设置 → 安全设置中配置:
| 配置项 | 说明 | 默认值 |
|---|---|---|
rate_limit_enabled | 启用访问频率限制 | 关闭 |
rate_limit_default_max | 默认每分钟最大请求数 | 120 |
rate_limit_default_duration | 默认限流时间窗口(秒) | 60 |
rate_limit_upload_max | 上传接口每分钟最大请求数 | 10 |
rate_limit_login_max | 登录接口每分钟最大请求数 | 10 |
rate_limit_register_max | 注册接口每小时最大请求数 | 3 |
rate_limit_admin_max | 管理接口每分钟最大请求数 | 300 |
CSRF/XSS 防护
| 配置项 | 说明 | 默认值 |
|---|---|---|
csrf_enabled | 启用CSRF防护 | 关闭 |
xss_filter_enabled | 启用XSS过滤 | 关闭 |
Cookie/Session 安全
| 配置项 | 说明 | 默认值 |
|---|---|---|
cookie_secure | Cookie仅HTTPS传输 | 关闭 |
cookie_httponly | Cookie禁止JS访问 | 开启 |
session_lifetime | Session有效期(秒) | 7200 |
生产环境建议
生产环境建议根据实际需求开启以下安全功能:
- 启用 HTTPS 后开启
cookie_secure - 公开网站建议开启
rate_limit_enabled - 表单提交建议开启
csrf_enabled
基础安全配置
1. 关闭调试模式
最重要!
生产环境必须关闭调试模式,否则会暴露敏感信息!
# .env
APP_DEBUG = false
2. 使用强密码
- 数据库密码至少 16 位
- 包含大小写字母、数字、特殊字符
- 不要使用默认密码
# .env
DB_PASS = Abc@123456789!@#
3. 保护 .env 文件
# 设置权限,仅所有者可读
chmod 600 .env
目录保护
系统已自动保护以下敏感目录:
/app/- 应用代码/config/- 配置文件/database/- 数据库文件/vendor/- 依赖包/runtime/- 运行时文件/view/- 视图模板
Nginx 配置
# 禁止访问敏感目录
location ~ ^/(app|config|database|vendor|runtime|view)/ {
deny all;
return 403;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
Apache 配置 (.htaccess)
# 禁止访问敏感目录
<DirectoryMatch "^/.*(app|config|database|vendor|runtime|view)">
Require all denied
</DirectoryMatch>
文件保护
受保护的文件类型
| 类型 | 扩展名 |
|---|---|
| 环境配置 | .env |
| 数据库 | .sql |
| 配置文件 | .ini, .yml, .yaml |
| 文档 | .md, README.md, LICENSE |
| 备份 | .bak, .backup, .swp, .tmp |
| 日志 | .log |
| 包管理 | composer.json, package.json, yarn.lock |
上传目录保护
防止 Webshell
禁止在上传目录执行 PHP 文件!
# Nginx
location ~* ^/(storage|static/uploads)/.*\.(php|php3|php4|php5|phtml|phar)$ {
deny all;
return 403;
}
安全响应头
系统已配置以下安全响应头:
1. Content-Security-Policy (CSP)
防止 XSS 攻击:
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; img-src 'self' data: https:; font-src 'self' data: https://cdn.jsdelivr.net; connect-src 'self'; frame-ancestors 'self';
2. X-Content-Type-Options
防止 MIME 类型嗅探:
X-Content-Type-Options: nosniff
3. X-Frame-Options
防止点击劫持:
X-Frame-Options: SAMEORIGIN
4. X-XSS-Protection
启用 XSS 过滤器:
X-XSS-Protection: 1; mode=block
5. Referrer-Policy
控制引用信息:
Referrer-Policy: strict-origin-when-cross-origin
6. Permissions-Policy
禁用不必要的浏览器功能:
Permissions-Policy: geolocation=(), microphone=(), camera=()
7. HSTS (HTTPS)
强制使用 HTTPS:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
SSL/HTTPS 配置
推荐配置
# 仅支持 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# 安全加密套件
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
# 禁用会话票证
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
Let's Encrypt 证书
# 安装 certbot
apt install certbot python3-certbot-nginx
# 申请证书
certbot --nginx -d your-domain.com
# 自动续签
certbot renew --dry-run
文件上传安全
系统实现了 6 层文件上传安全验证:
1. 文件扩展名检查
$allowedExt = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
2. MIME 类型检查
$allowedMime = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
3. 文件大小限制
$maxSize = 10 * 1024 * 1024; // 10MB
4. 图片有效性验证
// 检查是否为真正的图片
$imageInfo = getimagesize($file);
5. 文件内容扫描
// 检查是否包含 PHP 代码
if (preg_match('/<\?php/i', $content)) {
throw new Exception('非法文件');
}
6. 文件重命名
// 使用随机文件名
$filename = md5(uniqid()) . '.' . $ext;
CSRF 防护
系统使用 Token 验证防止 CSRF 攻击:
// 表单中添加
<input type="hidden" name="__token__" value="{$token}" />
// 或在请求头中
X-CSRF-Token: token_value
XSS 防护
输入过滤
// 自动过滤 HTML 标签
$title = strip_tags($input['title']);
输出转义
// 模板中自动转义
{$content|htmlspecialchars}
SQL 注入防护
使用 ORM 参数化查询:
// 正确 ✓
Db::name('photos')->where('id', $id)->find();
// 错误 ✗
Db::query("SELECT * FROM photos WHERE id = $id");
RBAC 权限管理
系统实现了完整的 RBAC(基于角色的访问控制):
角色层级
超级管理员
├── 管理员
│ ├── 内容审核员
│ └── 用户管理员
└── 普通用户
权限分配
// 检查权限
if ($user->hasPermission('admin.photo.delete')) {
// 允许删除
}
访问频率限制
防止暴力攻击和 DDoS:
// 每分钟最多 60 次请求
'rate_limit' => [
'max_requests' => 60,
'time_window' => 60,
]
安全最佳实践
1. 定期更新
# 更新系统
apt update && apt upgrade
# 更新 Composer 依赖
composer update
2. 监控日志
# 监控错误日志
tail -f runtime/log/error.log
# 监控访问日志
tail -f /var/log/nginx/access.log
3. 备份数据
# 每日备份数据库
0 2 * * * mysqldump -u root -p photo_gallery | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz
4. 防火墙配置
# 只开放必要端口
ufw allow 80
ufw allow 443
ufw allow 22 # SSH
ufw enable
5. 禁止 root 登录
# /etc/ssh/sshd_config
PermitRootLogin no
安全检查清单
部署前请检查:
- [ ]
APP_DEBUG = false - [ ] 数据库使用强密码
- [ ]
.env文件权限为 600 - [ ] 敏感目录已保护
- [ ] SSL 证书已配置
- [ ] HSTS 已启用
- [ ] 安全响应头已配置
- [ ] 上传目录禁止执行 PHP
- [ ] 防火墙已配置
- [ ] 备份策略已制定
安全事件响应
如果发现安全问题:
- 隔离系统 - 立即下线或限制访问
- 保存证据 - 保存日志和相关文件
- 分析原因 - 找出漏洞和攻击方式
- 修复漏洞 - 升级系统、修补漏洞
- 恢复服务 - 从备份恢复数据
- 事后总结 - 改进安全措施
