href 标记中的内容安全策略错误,但在内联事件处理程序上工作正常

Posted

技术标签:

【中文标题】href 标记中的内容安全策略错误,但在内联事件处理程序上工作正常【英文标题】:Content security policy error in href tag, but works fine on inline event handlers 【发布时间】:2021-08-08 06:45:04 【问题描述】:

我有 asp.net webforms 项目。我的内容安全策略头如下

default-src 'self' 'unsafe-eval' data:;style-src 'self' 'unsafe-inline';img-src * 'self' data:;font-src 'self' https://fonts.gstatic.com data:;frame-src * data: blob: js: javascript:;script-src 'self' 'unsafe-hashes' 'unsafe-inline' 'unsafe-eval'  'nonce-random123' 'strict-dynamic'; frame-ancestors 'self';worker-src 'self' blob: ;  script-src-attr  'self' 'unsafe-hashes' 'unsafe-inline' 'unsafe-eval'

在我的页面中,所有的内联 html 脚本都可以正常工作,比如

<body onload="javascript:"> <input type="submit" onclick="javascript: "> 

但是,如果我使用

<a href="javascript:webpostback()">

,它会在控制台中引发错误“拒绝运行 JavaScript URL,因为它违反了以下内容安全策略指令:”。为什么它在 href 上抛出错误,而不是在其他事件处理程序上,有什么可以避免的。

注意:我无法控制生成的内联脚本。因为项目是在网络表单上

控制台错误: Hello.aspx?A686142D6EC3F5E2=BD6AB64D03BB016326187CE1819DFD28:1 拒绝运行 JavaScript URL,因为它违反了以下内容安全策略指令:“script-src 'self' 'unsafe-hashes' 'unsafe-inline' 'unsafe-eval' 'nonce-73cfe2af-3129-4148-98eb-c0e6e442c1f0' 'strict-dynamic'”。请注意,如果源列表中存在哈希值或 nonce 值,则忽略“unsafe-inline”。

【问题讨论】:

最佳解决方案:完全避免内联处理程序,它们非常糟糕,没有理由在现代 JS 中使用 如果您可以包含整个控制台错误(删除可能的敏感部分)并给出使用各种浏览器的测试结果(因为 CSP 实现不同),这将有所帮助。 【参考方案1】:

一个'unsafe-hashes' 令牌should be paired 与所有内联事件处理程序的'hash-value' 令牌和打算允许的javascript:-navigations。例如,要允许&lt;a href="javascript:webpostback()"&gt;,您必须使用hash:

script-src-attr 'unsafe-hashes' 'sha256-9X0thXkX9FwOrSOPpwOgHBUeXkoM5C9BR3EfKcuXYZg=';

注意 1:'self''unsafe-eval'script-src-attr 中是 not supported。 注意 2:'unsafe-inline' 不能与 'unsafe-hashes' 配对,因为 'hash-value' 取消了 'unsafe-inline'

为什么它在 href 上抛出错误,而不是在其他事件处理程序上

这很奇怪。 Chrome 浏览器 supports 'unsafe-hashes' 以上两者的令牌。使用您展示的 CSP,Chrome 应该会抛出错误并用于内联事件处理程序和 JS 导航。 唯一的 Chrome 有一个 bug,在 javascript:-navigation 中对违反指令的定义错误。 JS:-navigation 包含在 script-src-attr 指令中。但是正如您在控制台错误中看到的那样,尽管您在 CSP 中有 script-src-attr,但 Chrome 仍显示在 script-src 中发生了违规。

Firefox 浏览器 supports 'unsafe-hashes' 用于内联事件处理程序(有错误),但不支持 'unsafe-hashes' 用于 javascript:-navigations。

Safari 完全支持not support 'unsafe-hashes'

因此目前只有一种使用'unsafe-hashes'的方式:

script-src 'unsafe-inline'; script-src-attr 'unsafe-hashes' 'sha256-...' 'sha256-...';

Chrome 将遵循script-src-attr 指令,其他浏览器不支持它并将使用'script-src' 中的'unsafe-inline'。 Chrome 用户会很安全,但你不能使用 'nonce-value' / 'hash-value' / 'strict-dynamic' 令牌,因为它们会覆盖 'unsafe-inline'

【讨论】:

以上是关于href 标记中的内容安全策略错误,但在内联事件处理程序上工作正常的主要内容,如果未能解决你的问题,请参考以下文章

带有内容安全策略的 Angular 12 CSS 优化内联事件处理程序

内容安全策略正在阻止 Firefox 中的 svg 图标精灵

TailwindCSS、Webpack 和 Sass:在 CSS 文件中使用时找不到类,但在内联 HTML 时工作正常

在内联表单集中使用 Django FileField

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

在内联元素中的块元素会自动换行..求解答~谢谢~