【问题标题】:Is this enough to prevent xss?这足以防止xss吗?
【发布时间】:2021-05-28 20:36:37
【问题描述】:

我正在开发一个网站,该网站将包含大量用户生成的内容。作为所见即所得的编辑器,我使用的是 tinyMCE。作为模板引擎,我使用的是ejs。 为了防止 XSS 我决定使用xss npm 包。 我正在使用这些自定义规则:

const strict = {
  whiteList: {},
}

const withTags = {
  whiteList: {
    div: [],
    strong: [],
    em: [],
    br: [],
    ul: [],
    li: [],
    ol: [],
    blockquote: [],
  },
}

假设用户使用文本区域并提交此代码:

<script>alert("hi")</script>

在我的数据库中以这种方式保存:

&lt;script&gt;alert("hi")&lt;/script&gt;

现在,当 ejs 呈现内容时,一些内容会以转义输出 () 呈现。渲染后的转义输出(html 页面)如下所示:

&amp;lt;script&amp;gt;console.log("test")&amp;lt;/script&amp;gt;

但是,某些内容是使用 ejs 未转义的原始输出 () 呈现的。 Html 看起来是这样的:

&lt;script&gt;console.log("test")&lt;/script&gt;

我有两个问题:

  1. 因为 被转义为 &amp;lt;&amp;gt; 呈现 ejs 非转义输出是否安全?
  2. 我所做的通常足以保护 XSS 吗?

非常感谢!

【问题讨论】:

  • 这是纯粹的编程问题,不在此处讨论。在 SO 上可以更好地回答。
  • @mentallurg 谢谢,我会尝试在 SO 上询问。

标签: xss


【解决方案1】:

首先,您的数据可能没有按照您提供的方式保存在数据库中。很可能它没有任何编码就存储在那里(应该如此)。

如果使用得当,EJS 本身会为您处理编码输出,以便您可以安全地构造参数化 HTML。但是在您的情况下,您希望禁用此保护以呈现原始 HTML,所以是的,您必须小心。有几个安全控制可供您使用。

1. DOMPurify

我个人没有使用过 xss 库,它似乎有很多下载量,可能这不是一个糟糕的选择。但是DOMPurify 可能更好。它也不需要配置,并且内置了对受信任类型的支持(我会在稍后介绍)。

你会使用它两次。当 HTML 由用户提交时首先在服务器端,当 HTML 由 EJS 呈现时在客户端。

如果您认真对待安全性,那么您会将来自服务器端净化的异常警报连接到您的 SIEM/SOC 等。然后您就会知道何时有人尝试对您的网站进行 XSS 攻击。

2。沙盒 iframe

您可以实现的另一个客户端控件是沙盒 iframe。您不只是在页面上呈现 HTML,而是创建一个 IFRAME,为其提供正确配置的 sandbox 属性,然后将纯化后的 HTML 设置为内容。现在,即使净化出现问题,恶意 HTML 也会被隔离在自己的世界中。

3.内容安全政策

针对 XSS 的最酷且(如果使用得当)最有效的防御是 CSP。它的工作原理是您对您的网站进行限制,例如“不执行脚本”、“不加载图像”等。然后您允许您确实想要执行的脚本,仅此而已。现在,如果攻击者设法在页面上注入脚本、链接、表单等,它将无法正常工作,因为它没有被明确允许。

我已经写了关于 CSP 的长篇 here,您甚至可以通过该文章中的 CodeSandbox 示例找到适用于您的案例(NodeJS 和 EJS)的具体示例。一般来说,关于 XSS 保护,您可以阅读更多 here

希望这会有所帮助!

【讨论】:

  • 非常感谢!我什至不知道沙盒 iframe 和 CSP。是的,它以这种方式保存在数据库中,因为它以这种方式进入数据库。 tinyMCE 和 xss 包将 替换为 &amp;lt;&amp;gt;
猜你喜欢
  • 2020-07-22
  • 2012-07-30
  • 1970-01-01
  • 2012-11-21
  • 2011-01-08
  • 1970-01-01
  • 2012-10-28
  • 2011-05-31
  • 2012-02-13
相关资源
最近更新 更多