【问题标题】:Is there an HTML tag whose contents simply cannot contain JavaScript?是否存在内容不能包含 JavaScript 的 HTML 标签?
【发布时间】:2019-09-18 05:22:18
【问题描述】:

这是一个愚蠢的问题,答案可能是“不”,但问起来也无妨……

我需要提取格式化文本作为 HTML 标记,然后发出 HTML 以显示格式化文本。这是一个非常常见的场景。甚至 StackOverflow 也必须处理它。 (如果你认为 markdown 本质上对 XSS 是安全的,谷歌“markdown xss”。)经过多次谷歌搜索,我很清楚白名单和黑名单 HTML 清理程序都有其问题,尤其是聪明的坏人总是看起来想办法绕过它们。

现在,显然,每个浏览器都知道如何解析 HTML 和执行 JavaScript(或其他脚本语言)。 XSS“规避消毒剂”攻击依赖于使用大多数消毒剂无法捕获但被浏览器识别为要执行的 JavaScript 代码的创造性构造。

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

这可能吗?

【问题讨论】:

    标签: html browser xss


    【解决方案1】:

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

    <safe>
       $content
    </safe>
    

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

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

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

    当然,请始终关注XSS prevention cheat sheet

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多