diff --git a/internal/middleware/security.go b/internal/middleware/security.go index 194a2a7..2c320d7 100644 --- a/internal/middleware/security.go +++ b/internal/middleware/security.go @@ -8,10 +8,16 @@ import ( // 作为纵深防御,不影响业务逻辑,纯附加 func SecurityHeaders() gin.HandlerFunc { return func(c *gin.Context) { - // Content-Security-Policy:仅允许本站资源 + 内联样式/脚本 - // img-src 允许 data: URI 用于头像裁切预览等场景 + // Content-Security-Policy + // script-src: 本站 + esm.sh CDN (CodeMirror 6 ESM 模块) + // connect-src: 本站 (Markdown 预览等 fetch 请求) + // img-src: 本站 + data: URI (头像裁切) + blob: (粘贴图片) c.Header("Content-Security-Policy", - "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:") + "default-src 'self'; "+ + "script-src 'self' 'unsafe-inline' https://esm.sh; "+ + "style-src 'self' 'unsafe-inline'; "+ + "img-src 'self' data: blob:; "+ + "connect-src 'self'") // 禁止 MIME 类型嗅探 c.Header("X-Content-Type-Options", "nosniff") diff --git a/templates/MetaLab-2026/html/posts/new.html b/templates/MetaLab-2026/html/posts/new.html index ed66b4b..15a47d8 100644 --- a/templates/MetaLab-2026/html/posts/new.html +++ b/templates/MetaLab-2026/html/posts/new.html @@ -124,27 +124,6 @@ {{template "layout/footer.html" .}} -{{/* CodeMirror 6 import map (MIT License, from jsdelivr CDN) */}} - +{{/* CodeMirror 6 (MIT License, via esm.sh bundle) */}} diff --git a/templates/MetaLab-2026/static/js/editor.js b/templates/MetaLab-2026/static/js/editor.js index 1ed32e8..eb22388 100644 --- a/templates/MetaLab-2026/static/js/editor.js +++ b/templates/MetaLab-2026/static/js/editor.js @@ -12,15 +12,17 @@ * - 字数/行数/阅读时间统计 * - 全屏编辑模式(F11) * - 滚动同步(分屏模式下) + * + * CodeMirror 6 通过 esm.sh bundle 加载,所有依赖自动解析。 */ -import { EditorState } from '@codemirror/state'; -import { EditorView, keymap, lineNumbers, highlightActiveLine, drawSelection } from '@codemirror/view'; -import { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands'; -import { markdown, markdownLanguage } from '@codemirror/lang-markdown'; -import { languages } from '@codemirror/language-data'; -import { syntaxHighlighting, defaultHighlightStyle } from '@codemirror/language'; -import { searchKeymap } from '@codemirror/search'; -import { autocompletion } from '@codemirror/autocomplete'; +import { EditorState } from 'https://esm.sh/@codemirror/state@6.5.2'; +import { EditorView, keymap, lineNumbers, highlightActiveLine, drawSelection } from 'https://esm.sh/@codemirror/view@6.36.4'; +import { defaultKeymap, history, historyKeymap, indentWithTab } from 'https://esm.sh/@codemirror/commands@6.8.1'; +import { markdown, markdownLanguage } from 'https://esm.sh/@codemirror/lang-markdown@6.3.2'; +import { languages } from 'https://esm.sh/@codemirror/language-data@6.5.1'; +import { syntaxHighlighting, defaultHighlightStyle } from 'https://esm.sh/@codemirror/language@6.11.0'; +import { searchKeymap } from 'https://esm.sh/@codemirror/search@6.5.10'; +import { autocompletion } from 'https://esm.sh/@codemirror/autocomplete@6.18.6'; /* ================================================================ DOM 引用