diff --git a/assets/js/preview.js b/assets/js/preview.js index 85c382d..984ab18 100644 --- a/assets/js/preview.js +++ b/assets/js/preview.js @@ -86,8 +86,23 @@ el = document.createElement('iframe'); el.className = 'pv-pdf'; el.src = src; - // PDF 是"另一份文档",别让它拿到本页的 window - el.setAttribute('sandbox', 'allow-same-origin allow-scripts'); + // ⚠️ 这里**绝对不能**加 sandbox 属性。加上去 PDF 会直接打不开: + // 页面只剩一行「此页面已被 Chromium 屏蔽」,阅读器根本不起。 + // + // 实测(Chromium 153,五组同源对照): + // · 无 sandbox → 正常渲染(多挂一个内置阅读器扩展 frame) + // · allow-same-origin allow-scripts → 屏蔽 + // · allow-scripts → 屏蔽 + // · + allow-popups-to-escape-sandbox → **仍然屏蔽**(网上很多答案说这个能救,本版本不行) + // · + allow-forms allow-popups → 仍然屏蔽 + // ⇒ 只要属性存在就不给 PDF 插件权限。加白名单无效,只能不加。 + // + // 不加也安全:PDF 由浏览器内置阅读器(mhjfbmdgcfjbbpaeojofohoefgiehjai) + // 在**独立扩展进程**里渲染,不是普通页面上下文,拿不到父页的 window / DOM / cookie。 + // PDF 是原生文档、不是 HTML,本就没有能访问父页面的脚本环境。 + // 服务端另有 `X-Content-Type-Options: nosniff` + MIME 按内容嗅探(media.php), + // PDF 不会被当 HTML 执行。若将来真需要禁止 PDF 内嵌 JS,正确做法是换 pdf.js 自渲染, + // 而不是给 iframe 挂 sandbox——那会把整个 PDF 预览一起废掉。 } else { el = document.createElement('img'); el.className = 'pv-img';