是否存在内容不能包含 JavaScript 的 HTML 标签?

Is there an HTML tag whose contents simply cannot contain JavaScript?

这是一个愚蠢的问题,答案可能是 "No",但问问也无妨...

我需要将格式化文本作为 HTML 标记提取,然后发出 HTML 以显示格式化文本。这是一个非常常见的场景。甚至 Whosebug 也不得不处理它。 (如果你认为 markdown 本质上对 XSS 是安全的,Google "markdown xss"。)经过大量谷歌搜索,我已经清楚白名单和黑名单 HTML 消毒剂都有他们的问题,尤其是其中,聪明的坏人似乎总能找到绕过他们的方法。

现在,很明显,每个浏览器都知道如何解析 HTML 并执行 JavaScript(或其他脚本语言)。 XSS "sanitizer evasion" 攻击依赖于使用大多数消毒剂无法捕捉到的创造性结构,但浏览器会将其识别为要执行的 JavaScript 代码。

因此,由于(希望经过清理)用户提供的 HTML(或用户提供的降价,转换为 HTML)作为 child 的某些 HTML 元素,似乎显而易见的解决方案是以某种方式告诉浏览器 不要执行该元素的子元素 .[=12 中包含的任何脚本代码=]

这可能吗?

我会说这对于当前的浏览器是不可能的,而且我真的不认为添加一个功能有什么用。假设我们在 HTML6 中创建了一个名为 <safe> 的新元素,其想法是绝对没有 javascript 在该元素内执行。我们将假设它完美无瑕地工作,零错误。所以,你会在服务器端做这样的事情。

<safe>
   $content
</safe>

其中 $content 表示不受信任的内容。看起来不错,除了有一个问题。如果 $content 里面有一个终止的 </safe> 标签怎么办?所以,你可能会说……很简单!我们只需要编码 </safe> 就可以了。这基本上已经是我们使用 XSS 的地方了。如果您可以编码 </safe>,那么您可以编码 <script><img> 以及其他任何内容。

也许有一个很好的方法来实现这个,但它似乎非常依赖于服务器端编码。

虽然 Markdown 有时可能会出现错误,但为此使用定期更新的库比使用白名单制定自己的解决方案要好得多。如果它对 Whosebug、Reddit、GitHub、Jira 等来说足够好……它可能对你正在构建的东西足够好。

当然,始终遵循XSS prevention cheat sheet