e50502d8f6
chat.js 首屏 308KB → 100KB(↓68%) 44 个重型模块改为 Vite 动态 import() Alpine 组件通过 $watch 监听实现真懒加载 新增 createLazyAlpineComponent 工具 + Proxy has 陷阱修复 补充 userCardComponent 全部 28 个属性默认值 vendor 依赖独立分包(108KB) 生产环境关闭 sourcemap
336 lines
11 KiB
Markdown
336 lines
11 KiB
Markdown
# 🛡️ 聊天室项目 — 安全与访问速度优化规划方案
|
||
|
||
> **项目路径:** `/Users/pllx/Web/Herd/chatroom`
|
||
> **技术栈:** Laravel 12 + PHP 8.4 + Redis + MySQL + Reverb (WebSocket) + TailwindCSS 4 + Vite
|
||
> **检查日期:** 2026-04-27
|
||
|
||
---
|
||
|
||
## 一、安全优化(🔴高危 / 🟡中危 / 🟢低危)
|
||
|
||
### 🔴 1. 关闭 APP_DEBUG(生产环境)
|
||
|
||
**当前:** `.env` 中 `APP_DEBUG=true`
|
||
**风险:** 生产环境开启 DEBUG 会在报错时泄露数据库密码、Redis 密码、Reverb 密钥等敏感信息。
|
||
|
||
**方案:**
|
||
```
|
||
# .env 生产环境改为
|
||
APP_DEBUG=false
|
||
```
|
||
|
||
---
|
||
|
||
### 🔴 2. 启用 Session 加密
|
||
|
||
**当前:** `SESSION_ENCRYPT=false`
|
||
**风险:** Session 数据以明文存储在 Redis 中,若 Redis 被入侵或存在 SSRF,用户身份数据全部泄露。
|
||
|
||
**方案:**
|
||
```
|
||
# .env 添加
|
||
SESSION_ENCRYPT=true
|
||
```
|
||
|
||
---
|
||
|
||
### 🔴 3. 限制 Reverb WebSocket 允许源(Allowed Origins)
|
||
|
||
**当前:** `config/reverb.php` 中 `'allowed_origins' => ['*']`
|
||
**风险:** 任何第三方网站均可连接你的 WebSocket 服务,可被用于 CSWSH(Cross-Site WebSocket Hijacking)攻击,窃取聊天消息。
|
||
|
||
**方案:**
|
||
```php
|
||
// config/reverb.php
|
||
'allowed_origins' => [
|
||
env('APP_URL', 'http://chatroom.test'),
|
||
// 如果有多个域名,手动列出
|
||
],
|
||
```
|
||
|
||
---
|
||
|
||
### 🔴 4. Reverb WebSocket 启用 TLS(WSS)
|
||
|
||
**当前:** `REVERB_SCHEME=http`,WebSocket 走明文 HTTP
|
||
**风险:** 所有聊天消息、用户在线状态等实时数据明文传输,可被中间人攻击窃听。
|
||
|
||
**方案:**
|
||
```
|
||
# .env 生产环境
|
||
REVERB_SCHEME=https
|
||
REVERB_PORT=443 # 或 8443
|
||
# 并在 reverb.php 中配置 TLS 证书路径
|
||
```
|
||
|
||
---
|
||
|
||
### 🔴 5. 设置 Session Cookie Secure 标志
|
||
|
||
**当前:** `SESSION_SECURE_COOKIE` 未设置(null)
|
||
**风险:** 在 HTTPS 下,未标记 Secure 的 Cookie 仍可能被非 HTTPS 连接泄露。
|
||
|
||
**方案:**
|
||
```
|
||
# .env 生产环境
|
||
SESSION_SECURE_COOKIE=true
|
||
SESSION_SAME_SITE=strict
|
||
```
|
||
|
||
---
|
||
|
||
### 🟡 6. 加强登录安全策略
|
||
|
||
**当前状况:**
|
||
- 存在验证码(mews/captcha)✅
|
||
- 登录有 `throttle:chat-login` 限流 ✅
|
||
- 自动注册(用户名+密码即可注册)⚡ 双刃剑
|
||
- MD5 老密码兼容 ✅ 会自动升级为 Bcrypt
|
||
|
||
**优化方案:**
|
||
|
||
| 项目 | 建议 |
|
||
|------|------|
|
||
| 登录失败锁定 | 同一 IP 5 次失败后临时锁定 15 分钟,后端实现 |
|
||
| 密码强度 | 最低 6 位,建议增加 min:6 验证或至少含数字/字母 |
|
||
| 管理员登录 2FA | id=1 站长登录时增加二次验证(如邮箱验证码) |
|
||
| 验证码频率 | 同一 IP 每天最多注册 3 个账号,防恶意注册 |
|
||
|
||
---
|
||
|
||
### 🟡 7. 敏感字段防止 Mass Assignment
|
||
|
||
**当前:** User 模型的 `$fillable` 中包含 `user_level`、`jjb`、`meili`、`bank_jjb`、`exp_num` 等金钱/权限字段。
|
||
|
||
**风险:** 如果其他地方调用了 `User::create($request->all())` 或 `User::update($request->all())` 且未使用 FormRequest 过滤,可能导致权限提升或刷币。
|
||
|
||
**方案:**
|
||
- 将 `user_level`、`jjb`、`meili`、`bank_jjb`、`exp_num` 等敏感字段移出 `$fillable`
|
||
- 仅在特定 Service 中使用 `forceFill()` 并加日志审计
|
||
|
||
---
|
||
|
||
### 🟡 8. XSS 输出转义检查
|
||
|
||
**当前:** 消息内容 `content` 限制 500 字符 ✅,但需确认前端渲染时是否正确转义 HTML。
|
||
|
||
**需要检查的点:**
|
||
- [ ] 聊天消息在前端如何渲染?(`innerHTML` 还是 `textContent`?)
|
||
- [ ] 用户签名(sign)字段是否转义?
|
||
- [ ] 房间公告是否转义?
|
||
- [ ] 用户头像路径是否校验?(当前有基本校验)
|
||
|
||
**建议加固:**
|
||
- 前端渲染消息一律使用 `textContent` 或 Vue/React 自动转义
|
||
- 如果必须支持 HTML 表情/颜色,使用白名单 sanitizer(如 DOMPurify)
|
||
|
||
---
|
||
|
||
### 🟡 9. 管理员操作审计加强
|
||
|
||
**当前:** 已有 `PositionAuthorityLog` 和 `AdminLog` 记录 ✅
|
||
**建议:**
|
||
- 所有金币/积分操作必须有完整的前后对比日志
|
||
- 敏感操作(封号、解封、改权限)推送微信通知给站长
|
||
|
||
---
|
||
|
||
### 🟡 10. 隐藏管理员入口路径
|
||
|
||
**当前:** `/lkddi` 作为管理员登录入口(隐藏路径),但路径硬编码在 `routes/web.php` 中。
|
||
**风险:** 任何能阅读源码或通过路径扫描的人都能发现。
|
||
|
||
**方案(可选):**
|
||
- 改为通过环境变量配置:`ADMIN_LOGIN_PATH=lkddi`
|
||
- 增加 IP 白名单限制:仅站长 IP 可访问 `/admin/*`
|
||
|
||
---
|
||
|
||
### 🟢 11. 其他安全改进
|
||
|
||
| 项目 | 说明 |
|
||
|------|------|
|
||
| CSP Header | 添加 Content-Security-Policy HTTP 头,限制脚本执行来源 |
|
||
| X-Frame-Options | 添加 DENY/SAMEORIGIN 防止点击劫持 |
|
||
| Reverb 消息大小上限 | 当前 10KB,建议根据业务适当降低 |
|
||
| 依赖安全扫描 | 定期运行 `composer audit` 检查 Laravel 及第三方包漏洞 |
|
||
| 文件上传安全 | 自定义头像上传已限制图片类型 ✅,但建议增加文件内容校验 |
|
||
|
||
---
|
||
|
||
## 二、访问速度优化(🔥高优 / ⚡中优 / 💡低优)
|
||
|
||
### 🔥 1. 启用 Laravel OPcache
|
||
|
||
**当前环境:** 通过 Laravel Herd 运行(PHP-FPM),未启用 OPcache。
|
||
**影响:** 每个 PHP 请求都要重新编译框架文件,浪费大量 CPU。
|
||
|
||
**方案(Mac/Linux 生产环境):**
|
||
```ini
|
||
; php.ini
|
||
opcache.enable=1
|
||
opcache.memory_consumption=128
|
||
opcache.max_accelerated_files=10000
|
||
opcache.revalidate_freq=0
|
||
opcache.validate_timestamps=0 ; 生产环境关闭文件修改检查
|
||
```
|
||
|
||
---
|
||
|
||
### 🔥 2. 数据库查询优化
|
||
|
||
**当前状况:**
|
||
- 使用 Redis 缓存,但部分页面可能直接查询 MySQL
|
||
- 存在多个游戏(百家乐、赛马、彩票、五子棋等),每次查询都走数据库
|
||
|
||
**优化方案:**
|
||
|
||
| 措施 | 说明 | 优先级 |
|
||
|------|------|--------|
|
||
| 排行榜缓存 | `->remember(60)` 缓存排行榜结果 60 秒 | 🔥 |
|
||
| 在线人数缓存 | 当前使用 Redis 实时维护 ✅,保持现状 | - |
|
||
| 房间列表缓存 | `Room::all()` 结果缓存到 Redis | 🔥 |
|
||
| 游戏配置缓存 | `GameConfig::isEnabled()` 结果缓存 10 秒 | ⚡ |
|
||
| 慢查询日志 | 启用 MySQL slow_query_log,定位慢 SQL | ⚡ |
|
||
|
||
---
|
||
|
||
### 🔥 3. 静态资源 CDN 加速
|
||
|
||
**当前:** 所有静态资源(CSS、JS、图片)直接从源服务器加载。
|
||
|
||
**方案:**
|
||
|
||
| 资源类型 | 方案 |
|
||
|----------|------|
|
||
| Vite 构建产物(CSS/JS) | 上传到 CDN(阿里云 OSS+CDN / CloudFlare R2) |
|
||
| 头像图片 | 启用单独域名或 CDN,添加长期缓存头 |
|
||
| 聊天背景图 | 使用 CDN 分发 12 张背景图 |
|
||
| Reverb WS 连接 | 通过 CDN/反向代理(如 Nginx)代理 WSS 连接 |
|
||
|
||
**当前已做:** `.htaccess` 中已对 Vite 构建产物设置 31536000 秒缓存 ✅
|
||
**改进:** 将 `public/build/` 下的资源部署到 CDN。
|
||
|
||
---
|
||
|
||
### 🔥 4. Reverb WebSocket 优化
|
||
|
||
**当前:** Reverb 单节点运行,HTTP 协议,端口 8080。
|
||
|
||
**优化方案:**
|
||
|
||
| 措施 | 说明 |
|
||
|------|------|
|
||
| 升级为 WSS | 启用 TLS,避免被运营商劫持/限速 |
|
||
| 水平扩展 | 启用 Reverb Scaling(通过 Redis 发布订阅,见 `reverb.php` 配置) |
|
||
| Nginx 反向代理 | 用 Nginx 代理 WSS,可同时处理 HTTP 静态资源 |
|
||
| 心跳优化 | 当前 `ping_interval=60s`,可考虑适当延长 |
|
||
|
||
---
|
||
|
||
### ⚡ 5. Laravel 应用层优化
|
||
|
||
| 措施 | 说明 | 优先级 |
|
||
|------|------|--------|
|
||
| 路由缓存 | `php artisan route:cache` — 减少路由注册开销 | ⚡ |
|
||
| 配置缓存 | `php artisan config:cache` — 减少 config 加载 | ⚡ |
|
||
| 事件缓存 | `php artisan event:cache` — L12 原生支持 | ⚡ |
|
||
| 视图缓存 | `php artisan view:cache` — Blade 编译缓存 | ⚡ |
|
||
| 模型预加载 | 检查 N+1 查询,使用 `->with()` | ⚡ |
|
||
|
||
**⚠️ 注意:** `php artisan optimize` 已在 Laravel 12 中被移除,应单独执行以上四个命令。
|
||
|
||
---
|
||
|
||
### ⚡ 6. Redis 优化
|
||
|
||
**当前:** 单机单实例 Redis,承载 Session、Cache、Queue、Reverb Scaling 全部功能。
|
||
|
||
**建议:**
|
||
- 生产环境建议至少 2 个 Redis 实例:一个用于 Session/Cache(可随时清),一个用于 Queue(需持久化)
|
||
- Reverb Scaling 发布订阅建议单独连接
|
||
- 为 Redis 设置 `maxmemory` 和 `maxmemory-policy allkeys-lru` 防止内存溢出
|
||
|
||
---
|
||
|
||
### ⚡ 7. 前端加载优化
|
||
|
||
| 措施 | 说明 |
|
||
|------|------|
|
||
| JS 代码分割 | Vite 动态 import 拆分大 JS 文件 |
|
||
| 懒加载 | 游戏模块(百家乐、赛马等)按需加载 |
|
||
| 图片懒加载 | 头像、礼物图片使用 `loading="lazy"` |
|
||
| Alpine.js 轻量化 | 当前已使用 Alpine.js ✅ 但避免过多 watcher |
|
||
|
||
---
|
||
|
||
### 💡 8. 考虑 Laravel Octane(长期规划)
|
||
|
||
**说明:** Laravel Octane(Swoole / RoadRunner)将应用常驻内存,消除框架启动开销,可带来 10-30 倍并发性能提升。
|
||
|
||
**条件:** 需要确保代码无静态变量状态污染,适合用户量增长后的升级。
|
||
|
||
---
|
||
|
||
## 三、实施优先级建议
|
||
|
||
### 第一阶段(紧急 · 1-2 天)🔴🔥
|
||
| # | 任务 | 预估工时 |
|
||
|---|------|---------|
|
||
| 1 | 关闭 `APP_DEBUG` | 5 分钟 |
|
||
| 2 | 启用 `SESSION_ENCRYPT` | 5 分钟 |
|
||
| 3 | 限制 Reverb `allowed_origins` | 10 分钟 |
|
||
| 4 | 配置 Route/Config/Event/View 缓存 | 30 分钟 |
|
||
| 5 | 排行榜、房间列表等 Redis 缓存 | 1 小时 |
|
||
|
||
### 第二阶段(重要 · 3-5 天)🟡⚡
|
||
| # | 任务 | 预估工时 |
|
||
|---|------|---------|
|
||
| 6 | 敏感字段移出 `$fillable` | 1 小时 |
|
||
| 7 | 登录失败锁定 + 注册频率限制 | 2 小时 |
|
||
| 8 | 数据库慢查询分析与索引优化 | 2 小时 |
|
||
| 9 | 前端 JS 懒加载与代码分割 | 3 小时 |
|
||
| 10 | OPcache 配置 | 30 分钟 |
|
||
|
||
### 第三阶段(完善 · 1-2 周)🟢💡
|
||
| # | 任务 | 预估工时 |
|
||
|---|------|---------|
|
||
| 11 | Reverb WSS + Nginx 反向代理 | 2 小时 |
|
||
| 12 | 管理员 2FA 验证 | 4 小时 |
|
||
| 13 | CDN 部署静态资源 | 1 天 |
|
||
| 14 | Content-Security-Policy 等安全头 | 1 小时 |
|
||
| 15 | 生产环境 Redis 分实例部署 | 2 小时 |
|
||
| 16 | 评估 Laravel Octane 迁移 | 2-3 天 |
|
||
|
||
---
|
||
|
||
## 四、检查清单工具
|
||
|
||
部署到生产环境前可使用以下命令快速检查:
|
||
|
||
```bash
|
||
# Laravel 安全检查
|
||
php artisan about # 查看环境配置
|
||
php artisan route:list # 查看所有路由(确认无暴露的管理路径)
|
||
|
||
# Composer 安全审计
|
||
composer audit
|
||
|
||
# 缓存优化
|
||
php artisan config:cache
|
||
php artisan route:cache
|
||
php artisan event:cache
|
||
php artisan view:cache
|
||
|
||
# 依赖更新
|
||
composer update --no-dev -o
|
||
```
|
||
|
||
---
|
||
|
||
> **总结:** 该项目整体架构设计良好(Redis + Reverb 实时通信 + Alpine.js 轻量前端),
|
||
> 主要安全短板集中在**生产环境配置**(DEBUG 未关、Session 未加密、WebSocket 无 TLS)和**部分敏感字段保护**。
|
||
> 速度优化则聚焦于**缓存策略**和**CDN 静态资源分发**。
|
||
>
|
||
> 建议从第一阶段紧急问题入手,逐步推进到第二阶段。需要我帮你实施其中任何一部分,随时说!
|