如何为 HTML 属性设置内容安全策略

Posted

技术标签:

【中文标题】如何为 HTML 属性设置内容安全策略【英文标题】:How to set a content security policy for HTML attributes 【发布时间】:2021-07-28 09:24:27 【问题描述】:

我正在使用 node.js,我想为某些东西设置 CSP,例如 javascript 和 CSS。我可以使用随机数和散列,但我将如何允许 html 属性,例如:

<div style="color:blue;" onclick="myFunction()"></div>

由于这两个都是 CSS 或 JavaScript,我的 CSP 会阻止它们。我能做些什么?我不想实现unsafe-inline

【问题讨论】:

您可以查看this。 @ApoorvaChikara 所以你说这里没有我想做的选择。 是的,这是在 MDN-web 文档中指定的。可能有一些技巧可以做到这一点。 【参考方案1】:

'unsafe-hashes' 令牌用于 HTML 属性的 CSP 规范。但在 Safari 中它仍然是 not supported。

因此,您有很多程序员的选择,这取决于您准备重写代码的深度:

    在发送到浏览器之前,一定要在服务器上截取完成的 HTML 代码,以提取 style='...'onclick='...' 构造,并用安全构造替换它们(样式类和脚本类 addEventListeners()) . 可能 NodeJS 有一些有用的插件。

    使用样式,您可以将 style="color:blue;" 替换为 data-style="color:blue;" 和 通过像that这样的脚本处理所有这些。 只需相应地调整它并使用像el.style.backgroundColor = ... 这样的安全结构,但不是不安全的Element.setAttribute(style)

    对于内联事件处理程序,您可以使用this techique(它用于 jQuery,重写它以使用 addEventListeners)。

    使用最佳实践完全重写代码 - 分离标记和数据。 将所有 style="color:blue;" 移入类 (class='blueColor'`)。您可以指定类名称,如“color-blue”、“display-hidden”等,以便于理解。 在单独的脚本中将所有内联事件处理程序替换为 addEventListener()。

【讨论】:

以上是关于如何为 HTML 属性设置内容安全策略的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应中禁用内容安全策略

NUXT的SPA模式可以设置内容安全策略吗

忽略样式属性的内容安全策略随机数

Java进阶 | Java注入安全策略,代码实战

设置 iframe 的内容安全策略?

如何绕过EdgeChrome和Safari的内容安全策略