- 但是由于所有的 HTML都是静态的,我如何为每个请求添加一个新的随机数到脚本标签(就像随机数的实际情况一样)?
A'hash value'
是常用的,因为nonce="value"
每次重新加载页面时很难将属性动态插入到脚本和样式标签中。
但是对于 Nginx Web 服务器,有一个使用服务器过滤器(ngx_http_sub_module
或ngx_http_substitutions_filter_module
)的解决方案。
在静态 HTML 中,您使用一些“唯一字符串”:
<script nonce="@@=AAABBBCCCZZZ=@@"></script>
它被服务器的过滤器替换为服务器生成的值($request_id):
location / {
subs_filter @@=AAABBBCCCZZZ=@@ $request_id;
}
但是这些模块可能默认没有内置到 Nginx 服务器中,您必须重新构建服务器。
- 在这种情况下,提供所有必需脚本和样式的哈希是否比 nonce 更好?
主要'hashe-value'
用于 SPA(单页应用程序),您无法刷新nonce
价值。但是当您更改代码并需要用新的哈希替换一些哈希时,很难使用大量哈希来管理 CSP。
所以在服务端渲染的情况下,'nonce value'
使用的比较多。此外,不仅'nonce value'
可以用于内联脚本,还可以用于外部脚本。
另请参阅下面有关 JS 框架的评论 - 这些可能与'nonce-value'
或不兼容'hash-value'
。
- 如果我重构所有 HTML 的代码以从 body 标记中删除所有内联脚本并将代码添加到 head 的单个脚本标记中,这是否意味着内联脚本被消除了?
消极的。CSP 不仅将<script>
标签视为内联脚本,而且将内置标签事件处理程序(如<button onClick='...'>
javascript-navigation 类型的<a href='void(0)'>
.
像 jQuery 这样的一些 JS 框架也需要强制'unsafe-inline'
or'unsafe-eval'
并且可能与'nonce-value'
or不兼容'hash-value'
。jQuery自v3.5.0
起
兼容。但是 jQuery 几乎不兼容,因为它动态生成主脚本并将其插入到部分中。'nonce-value'
'hash-value'
<head>