安全审计 #23/#24/#25/#27(security_todo.md P3): - #23 用户名/域名格式校验:用户名白名单 ^[a-zA-Z0-9._-]{1,64}$ (杜绝含 @ 用户名导致的 GetByEmail 解析歧义),域名按标签校验 (字母/数字/连字符、标签 ≤63、总长 ≤253,允许单标签内部域名); CreateUser/UpdateUser/CreateDomain 接入,新增 renderUserFormError 共用错误渲染 - #24 密码最小长度 8 位:统一 minPasswordLength,接入自助修改、 管理员创建、管理员重置三处,新增中/英/日 i18n 文案 - #25 POP3/IMAP 明文认证限制:配置了 TLS 且来源非回环时必须先 STLS/STARTTLS 再认证;新增 store.IsLoopbackIP 与 [imap]/[pop3] allow_insecure_auth 配置项(默认 false 强制)。 顺带修复存量缺陷:POP3S 隐式 TLS 端口 tlsActive 恒为 false (原仅 STLS 命令置位),连接中心注册的 TLS 标记同步修正。 部署注意:默认行为收紧,内网明文老客户端需改用 TLS 或显式 配置 allow_insecure_auth = true - #27 IncrementFail 并发首建窗口丢失更新:冲突 INSERT 由 DoNothing 改为 fail_count 自增,TestIncrementFailConcurrent 在 -race -count=5 下从偶发失败变为稳定通过 - 新增 17 项单测(校验矩阵/handler 拒绝放行路径/settings 密码/ POP3 明文拒绝与放行/回环判定) - security_todo.md 勾选 #23/#24/#25/#27;登记存量备注:4 个 cache=shared 测试在 -count>1 下非幂等(UNIQUE 冲突,与 CI 默认单轮跑法无关)
21 lines
591 B
Go
21 lines
591 B
Go
package store
|
|
|
|
import "testing"
|
|
|
|
// TestIsLoopbackIP 验证回环地址判定:明文认证仅放行回环来源(#25),
|
|
// 非 IP 字符串(如 net.Pipe 的 "pipe")一律视为非回环。
|
|
func TestIsLoopbackIP(t *testing.T) {
|
|
loopback := []string{"127.0.0.1", "127.9.9.9", "::1"}
|
|
for _, ip := range loopback {
|
|
if !IsLoopbackIP(ip) {
|
|
t.Fatalf("IsLoopbackIP(%q) = false, want true", ip)
|
|
}
|
|
}
|
|
external := []string{"203.0.113.5", "", "pipe", "not-an-ip"}
|
|
for _, ip := range external {
|
|
if IsLoopbackIP(ip) {
|
|
t.Fatalf("IsLoopbackIP(%q) = true, want false", ip)
|
|
}
|
|
}
|
|
}
|