0

我必须将 CSP 标头添加到站点。问题是这是一个遗留代码,并且 HTML 中有很多内联脚本和样式。我不能使用“unsafe-inline”,因为其目的实际上是使网站安全,并且该指令在 OWASP ZAP 工具扫描中给出了危险信号。我可以在一定程度上重构 HTML 和 JS 代码,但我有几个问题:

  1. 我尝试了一个固定的随机数(仅用于 POC)和将内联脚本列入白名单的哈希方式。但是由于所有的 HTML 都是静态的,我如何为每个请求添加一个新的随机数到脚本标签(就像随机数的实际情况一样)?

  2. 在这种情况下,提供所有必需脚本和样式的哈希是否比 nonce 更好?

  3. 如果我重构所有 HTML 的代码以从 body 标记中删除所有内联脚本并将代码添加到 head 的单个脚本标记中,这是否意味着内联脚本被消除了?简而言之,是否算作内联脚本?

4

1 回答 1

1
  1. 但是由于所有的 HTML都是静态的,我如何为每个请求添加一个新的随机数到脚本标签(就像随机数的实际情况一样)?

A'hash value'是常用的,因为nonce="value"每次重新加载页面时很难将属性动态插入到脚本和样式标签中。
但是对于 Nginx Web 服务器,有一个使用服务器过滤器(ngx_http_sub_modulengx_http_substitutions_filter_module)的解决方案。
在静态 HTML 中,您使用一些“唯一字符串”:

<script nonce="@@=AAABBBCCCZZZ=@@"></script>

它被服务器的过滤器替换为服务器生成的值($request_id):

location / {
    subs_filter @@=AAABBBCCCZZZ=@@ $request_id;
    }

但是这些模块可能默认没有内置到 Nginx 服务器中,您必须重新构建服务器。

  1. 在这种情况下,提供所有必需脚本和样式的哈希是否比 nonce 更好?

主要'hashe-value'用于 SPA(单页应用程序),您无法刷新nonce价值。但是当您更改代码并需要用新的哈希替换一些哈希时,很难使用大量哈希来管理 CSP。

所以在服务端渲染的情况下,'nonce value'使用的比较多。此外,不仅'nonce value'可以用于内联脚本,还可以用于外部脚本。

另请参阅下面有关 JS 框架的评论 - 这些可能与'nonce-value'或不兼容'hash-value'

  1. 如果我重构所有 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>

于 2021-10-29T16:11:53.080 回答