



























功能是在富文本编辑器创建/编辑一些图文内容, 图文图文, “文”没什么需要操心的, 主要是“图” 。
图乍一看好像也没什么担心的, 但是用户行为大概率不会按照期望去做。, 有图片上传按钮,但是用户可能会粘贴或者拖拽,刚开始暂时都还能显示, 只是个别会因为跨域或者验证限制什么的会无法显示。但这从外部来的 src 链接不是自己服务器的, 指不定什么时候就失效了。所以理想情况还是要下载存储到服务器。
wangeditor, 用户添加图片的行为主要是Files 会触发 editor 的上传事件, 就走到了合法流程。如果用的 editor 没有触发, 也可以通过监听 paste / drop 事件来监听:wangeditor 监听了 drop 事件而且大概是把事件挂在了里面的元素上, 而不是外层的 container, 而 event 默认是冒泡, 从里到外传递。而我们已知的元素是 container, 如果把 drop 事件挂在 container 上, editor 会成先一步完成。所以设置 drop 事件的时候将模式修改为使用捕获模式, 从外到里, 才能在 container 上拦截 drop 事件types 可能包含 text/html, 也有可能包含复制的时候被设置的自定义的类型, 这里面的资源就需要自己解析处理了可能包含的图片资源
Base64 encoded images
SVG files (potential XSS risk)
wangeditor 转化为普通标签, 也就是会不显示xss 攻击, 可以通过转 image src, 再放到 canvas, 最后转化成图片(可以参考这篇文章使用 canvas 绘制 dom)http 开头的远程链接
创建临时 div 获取 img 标签
遍历 img 标签, 筛选校验符合要求的资源。这一步就只能做筛选图片地址, 限制图片数量
1 | const container = document.createElement('div'); |
下载 => response => blob => 上传 => 替换 src
content type 获取, 图片名称也可以自己生成, 尽量不要从图片链接中提取信息。如果需要从链接获取信息, 做好字符过滤body 之前, 可以先校验格式和尺寸, 避免浪费时间awita fetch 阶段, 浏览器只下载 response headers and status``, body 会在 response.blob(), response.arrayBuffer(), response.text(), or response.json() 调用的时候被下载1 | const response = await fetch(src); |
html 标签, html or plain text 是怎么决定的?Plain Text (text/plain) 纯字符串, 没有任何格式HTML (text/html), 老伙伴了,可能包含 xss 攻击Rich Text (text/rtf) 被很多编辑器(Microsoft Word, WordPad)使用的跨平台格式, 和 html 相比, 不支持多媒体资源, 交互功能不强Custom Formats, 自定义的类型, 比如 vscode 就自定义了自己的类型 vscode-editor-data此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。