逍遥图库系统逍遥图库系统
首页
  • 快速开始

    • 项目介绍
    • 安装指南
    • 快速开始
  • 深入了解

    • 配置说明
    • 部署指南
    • 安全配置
  • 用户系统
  • 图片管理
  • 相册管理
  • 互动功能
  • 管理后台
  • PWA 渐进式应用
  • API 概述
  • 认证接口
  • 图片接口
  • 相册接口
  • 用户接口
  • 管理接口
  • 主题系统
  • 性能优化
  • 常见问题
  • 更新日志
Gitee
首页
  • 快速开始

    • 项目介绍
    • 安装指南
    • 快速开始
  • 深入了解

    • 配置说明
    • 部署指南
    • 安全配置
  • 用户系统
  • 图片管理
  • 相册管理
  • 互动功能
  • 管理后台
  • PWA 渐进式应用
  • API 概述
  • 认证接口
  • 图片接口
  • 相册接口
  • 用户接口
  • 管理接口
  • 主题系统
  • 性能优化
  • 常见问题
  • 更新日志
Gitee
  • 入门指南

    • 项目介绍
    • 安装指南
    • 快速开始
  • 进阶配置

    • 配置说明
    • 部署指南
    • 安全配置

安全配置

本指南介绍逍遥图库系统的安全配置和最佳实践。

安全评级

逍遥图库系统经过全面安全加强,达到 A+ 级企业安全标准。

安全项目评级说明
SSL/TLSA+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_secureCookie仅HTTPS传输关闭
cookie_httponlyCookie禁止JS访问开启
session_lifetimeSession有效期(秒)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
  • [ ] 防火墙已配置
  • [ ] 备份策略已制定

安全事件响应

如果发现安全问题:

  1. 隔离系统 - 立即下线或限制访问
  2. 保存证据 - 保存日志和相关文件
  3. 分析原因 - 找出漏洞和攻击方式
  4. 修复漏洞 - 升级系统、修补漏洞
  5. 恢复服务 - 从备份恢复数据
  6. 事后总结 - 改进安全措施

下一步

  • 部署指南 - 生产环境部署
  • 性能优化 - 性能优化
在 Gitee 上编辑此页
Prev
部署指南