如何在允许格式化的 JavaScript 编辑器中进行清理

Posted

技术标签:

【中文标题】如何在允许格式化的 JavaScript 编辑器中进行清理【英文标题】:How to handle sanitizing in JavaScript editors that allow formatting 【发布时间】:2018-04-17 11:17:16 【问题描述】:

现在,像 Medium 这样的许多编辑器都提供格式设置。从我在 DOM 中看到的内容来看,它只是添加了 html。但是如何在不丢失用户应用的格式的情况下清理这种输入呢?

例如点击粗体添加:

<strong class="markup--strong markup--p-strong">text</strong>

但如果用户自己输入,您不会想要呈现。那有什么不同呢?如果您使用 markdown 进行样式设置但也不让用户输入他们自己的 markdown 而是使其只能通过浏览器访问,那也会有所不同吗?

我能想到的一种方法是转义每个 HTML 特殊字符,但这似乎很奇怪。据我所知,您仅在输出内容时对其进行消毒

【问题讨论】:

你必须找到来源——特别是你指的媒介?使用开发工具查找 JS 中被吐出的位置然后偏转它 【参考方案1】:

您应该使用服务器端消毒剂,正如 Vipin 所说,因为客户端验证很容易被篡改。 OWASP(开放式 Web 应用程序安全项目)有一些您可以使用的指南和清理程序,例如 java-html-sanitizer。

有关该概念的一般简介,请阅读消毒部分下的https://www.owasp.org/index.php/Data_Validation。

【讨论】:

【参考方案2】:

您可以将白名单中的元素替换为其他字符,例如:

<strong.*> becomes |strong|

然后您删除所有其他 HTML。注意 onmouseover="alert(1)" 所以要保持简单。

在呈现用户输入时也要小心。不要只是将其添加为代码。而是解析它并使用 javascript 创建元素。永远不要使用 innerHTML,但一定要使用 .innerText 和 document.createElement()。

【讨论】:

以上是关于如何在允许格式化的 JavaScript 编辑器中进行清理的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HTML/Javascript 中创建可编辑的组合框?

如何在 Firebug 中编辑 JavaScript?

如何在HTML / Javascript中创建可编辑的组合框?

粘贴到 KendoUI 编辑器时,如何从文本中删除所有 html 格式?

如何使用 Javascript 获取选定文本中的所有 HTML 选择标签?

如何在 Sublime Text 编辑器 3 中格式化代码 [重复]