2026-06-08 Markdown 视频 / iframe 渲染完整修复
本次围绕编辑器视频插入、二次编辑回显、文章详情页正文视频显示和视频展示尺寸做完整修复,重点解决 B 站 iframe 保存后实体化、再次编辑变成 <iframe ... "...、详情页只显示黑块以及宽屏下视频过宽的问题。
主要改动:
- 编辑回显实体化修复
- 文件:route/post.php
- 编辑帖子 GET 回显时,不再提前对正文执行
htmlspecialchars()。
- 改为使用
post_markdown_decode_entities_deep() 先还原历史多层实体,再交由模板 textarea 统一转义输出。
- 避免保存后再次编辑时 iframe / video HTML 被重复转义成纯文本实体。
- Markdown 视频识别和实体解码增强
- 文件:model/post.func.php
post_markdown_is_embed_video_url() 改为使用深度实体解码,兼容 &、& 等多层转义后的播放器地址。
post_markdown_safe_url()、post_markdown_iframe_html()、post_markdown_video_html() 继续统一走安全 URL 过滤。
- 支持 video、B 站 iframe 代码、B 站播放器 URL,以及 mp4/webm/ogg 等视频直链。
- HTML 安全白名单补充视频能力
- 文件:model/misc.func.php
- HTML 白名单允许安全的
video、source、iframe 标签和必要属性。
- 补充 / 修正
controls、preload、scrolling、frameborder、framespacing、allowfullscreen 等属性规则。
- 修复
allowfullscreen="true" 被重复规则覆盖的问题。
- 底层安全过滤器 iframe 硬编码修复
- 文件:xiunophp/xn_html_safe.func.php
- 原底层过滤器对
iframe/embed src 有额外硬编码,只允许旧的优酷播放器地址,导致 B 站 iframe 的 src 被清空,详情页只剩黑色容器。
- 已改为只放行明确受支持的视频播放器地址:
player.bilibili.com/player.html?...
www..com/embed/...
player.youku.com/embed/...
- 仍不允许任意 iframe 地址,避免重新放开通用 iframe 带来的安全风险。
- 编辑器前端预览同步
- 文件:view/htm/post.htm
- 前端预览支持从 iframe 代码中提取
src。
- 支持多层实体转义后的 iframe 识别。
- 视频按钮可插入 video,预览层和服务端渲染规则保持一致。
- 文章详情页视频宽度优化
- 文件:view/css/bootstrap-bbs.css
- 视频和播放器 iframe 改为居中显示。
- 最大宽度限制为
min(100%, 860px),避免宽屏正文区视频过宽。
- iframe 高度由固定
420px 改为 aspect-ratio: 16 / 9 自适应。
- 移除 iframe 固定最小高度,移动端和窄屏下按容器宽度自然缩放。
影响说明:
- 不需要数据库结构变更。
- 已保存为原始 iframe、实体化 iframe 或 video 的内容,在重新打开编辑页时会尽量还原为可编辑文本。
- 历史帖子详情页会在展示时重新经过安全渲染;如果仍显示旧内容,优先清理
tmp/* 并重置 OPcache。
- 本次只允许受支持的视频播放器 iframe,不恢复任意 iframe 嵌入能力。
欢迎大家加入QQ交流群:785017513