# Smail 工程优化审核报告 > 审核日期:2026-08-24 > 审核基线:`e91a641 重命名项目并补充插件与安全整改文档` > 审核分支:`main` > 审核范围:当前工作区 `D:\Desktop\Smail`,依据 `docs\安全审查风险整改任务清单.md` 对 SEC-001 至 SEC-022 进行工程优化与安全整改复核。 > 审核结论:本轮未发现可以标记为“复审通过”的任务;整改清单中的 22 项状态保持不变。 ## 一、审核结论摘要 当前项目可以完成前端生产构建,部分后端单元包测试通过,但尚不具备安全上线条件。主要阻断原因如下: 1. SMTP 587 端口在 STARTTLS 建立前允许认证,并且认证日志会输出密码。 2. 初始化接口暴露在普通 HTTP 服务上,缺少一次性令牌、来源限制、速率限制和失败次数限制。 3. `HttpsEnabled == 2` 时,HTTP 直接承载完整业务路由和会话。 4. 密码认证仍使用固定盐 MD5;登录、初始化、改密、管理员重置和 SMTP 登录没有统一的新凭据验证服务。 5. 邮件移动、分组删除和 IMAP UID 查询存在用户归属校验缺口。 6. 请求体、邮件附件和 Base64 解码后的内容没有形成统一的大小限制策略。 7. 未形成统一 CSRF、防安全响应头、插件隔离、TLS 证书校验和依赖漏洞审计流程。 8. `go vet ./...` 仍然失败;全量 `go test ./...` 存在删除真实配置和数据库的测试副作用,未在当前工作区执行。 因此,建议先完成 P0 全部整改,再进入 P1 的认证、租户隔离和输入安全整改,最后完成 P2 的工程加固和 CI 门禁。 ## 二、复审状态总览 | 任务编号 | 优先级 | 审核状态 | 结论 | 关键证据 | | --- | --- | --- | --- | --- | | SEC-001 | P0 | 未通过 | 不通过 | `backend/listen/smtp_server/smtp.go:28` 在 587 端口设置 `AllowInsecureAuth = true` | | SEC-002 | P0 | 未通过 | 不通过 | `backend/listen/smtp_server/action.go:68,92,96` 记录用户名、密码和完整用户对象 | | SEC-003 | P0 | 未通过 | 不通过 | `setup_server.go:27-29,52-58` 暴露初始化服务;业务拦截只按 `/api/setup` 放行 | | SEC-004 | P0 | 未通过 | 不通过 | `http_server.go:69-90` 在关闭 HTTPS 时仍注册业务路由和会话 | | SEC-005 | P1 | 未通过 | 不通过 | `group.go:123-126` 只校验邮件所属用户,未校验目标分组所属用户 | | SEC-006 | P1 | 未通过 | 不通过 | `group.go:88` 更新 `user_email` 时缺少 `user_id` 条件 | | SEC-007 | P1 | 未通过 | 不通过 | `utils/password/encode.go` 使用两次 MD5 和固定字符串盐 | | SEC-008 | P1 | 未通过 | 不通过 | 多个控制器直接 `io.ReadAll(req.Body)`;附件缺少统一数量、总量和解码后大小限制 | | SEC-009 | P1 | 未通过 | 不通过 | 路由使用 `mux.HandleFunc`,未见统一 HTTP 方法和 CSRF 防护中间件 | | SEC-010 | P1 | 未通过 | 不通过 | 邮件清理允许全局 `style`、`