- internal/config:serve/init/backup/gc 子命令参数解析(--dev 强制 loopback 守卫) - internal/store:user_version 版本化迁移(仅追加式 + 越界拒启 + --allow-newer)、 笔记/图片/引用/会话/设置 DAO、并集可见性查询、VACUUM INTO 在线备份、 回收站 30 天 + 孤儿图 7 天宽限 gc - internal/auth:Argon2id PHC 串(m=19456,t=2,p=1)、256bit token 与 SHA-256 摘要 - internal/markdown:goldmark(默认转义)+ bluemonday 双保险,摘要纯文本提取 - internal/middleware:安全头(CSP/HSTS/nosniff 等)、错误日志、 有界令牌桶限流(per-IP 桶上限 + TTL 逐出)、Origin/Referer 同源校验
34 lines
988 B
Go
34 lines
988 B
Go
package markdown
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// 服务端渲染防线(§9.1-T1):goldmark 转义 + bluemonday 白名单。
|
|
func TestRenderEscapesDangerousHTML(t *testing.T) {
|
|
out := Render("# 标题\n\n<script>alert(1)</script>\n\n[link](javascript:alert(1))\n\n**bold**")
|
|
if strings.Contains(out, "<script>") {
|
|
t.Errorf("script 应被转义: %s", out)
|
|
}
|
|
if strings.Contains(out, `href="javascript:`) {
|
|
t.Errorf("javascript: 协议应被剥除: %s", out)
|
|
}
|
|
if !strings.Contains(out, "<strong>bold</strong>") {
|
|
t.Errorf("正常 Markdown 应渲染: %s", out)
|
|
}
|
|
}
|
|
|
|
func TestSummary(t *testing.T) {
|
|
got := Summary("# 标题\n\n这是**正文**内容,包含 <b>HTML</b>。", 10)
|
|
if strings.ContainsAny(got, "<>#*") {
|
|
t.Errorf("摘要应为纯文本: %q", got)
|
|
}
|
|
if strings.Count(got, "")-1 > 11 { // 10 runes + 可能的省略号
|
|
t.Errorf("摘要应截断: %q", got)
|
|
}
|
|
if s := Summary("", 100); s != "" {
|
|
t.Errorf("空内容摘要应为空: %q", s)
|
|
}
|
|
}
|