在内容安全性策略中将随机数或哈希值用于内联样式

时间:2018-08-10 20:40:23

标签: javascript reactjs security content-security-policy

我正在为我的Web应用程序添加内容安全策略设置,并且希望对内联脚本和内联样式严格。我的内联脚本可以正常工作,但是内联样式有问题。作为背景,我的Web应用程序在后端使用Elixir / Phoenix,并在前端包含React组件。

现成的内嵌脚本-有效

我只有少量内联脚本来引导React组件。对于CSP guidelines,我使用的是nonce值来处理这些内联脚本。具体来说,我在每次页面加载时生成一个新的nonce值服务器端,并将其包含在content-security-policy标头中,并使用服务器端渲染将其注入脚本标签的nonce属性中。效果很好。

内联样式的即时显示-不起作用

内联样式是另一个故事。内联样式在React中很常见。我希望我可以为此使用类似的随机数方法,但是到目前为止,我还没有能够使它起作用。 Nonce值在https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src的style-src页面中列出,因此这似乎应该可以工作,尽管doc的该部分引用了脚本,所以也许不行。我尝试将nonce属性注入到生成的HTML中,但这不起作用。我继续收到正常的错误消息。

Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'self' 'nonce-my-long-ugly-random-nonce-value'". Either the 'unsafe-inline' keyword, a hash ('sha256-specific-hash'), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.

我已经搜索了一段时间,但没有找到任何暗示现时值适用于内联样式的暗示,除了我上面提到的以外。任何人都可以确认随机数值适用于内联样式吗?

如果它们不起作用,似乎使用哈希是我的下一个最佳选择。通过查看上面的每条错误消息并将哈希添加到content-security-policy标头中,可以使哈希工作。不过,这不是一个非常可扩展的解决方案,如果我必须走那条路,我想知道是否有人想出了一种自动生成哈希的方法,而无需手动导航应用中的任何地方并查看错误消息以获取哈希。

感谢您能提供的任何帮助。

谢谢。 贾斯汀

1 个答案:

答案 0 :(得分:0)

在查看Content Security Policy allow inline style without unsafe-inline之后,似乎不支持此操作,可能是因为规范似乎暗示它仅引用<style>标签中的内联样式,类似于该规范对内联的引用方式<script>标签中的脚本。

假设这是正确的,看来我将不得不使用哈希路径或仅为'unsafe-inline'添加style-src