使用Apache 2.4生成nonce(用于内容安全策略标头)

1cosmwyk  于 2023-01-26  发布在  Apache
关注(0)|答案(5)|浏览(537)

我们正在努力创建一个严格的内容安全策略(https://csp.withgoogle.com/docs/strict-csp.html),它要求Apache在每次请求资源时创建一个nonce,以便我们可以将此nonce插入http报头。
我们如何在Apache 2.4中创建一个nonce?
我读过的所有与CSP相关的文档都说“nonce是服务器上生成的随机字符串,包含在CSP头文件中......”,但没有找到任何关于如何在Apache上实现这一点的信息。我们当然可以在应用程序代码中实现这一点,但通过Apache实现似乎是一个更干净的解决方案/将确保每个页面都获得CSP头文件。

jrcvhitl

jrcvhitl1#

您需要在服务器上生成nonce,然后让Apache将该nonce传递给您的脚本,以便使用它。
我们为Apache创建了一个开源模块,它简化了这个过程:一个月一次
下面是服务器端配置的一个简单示例:

LoadModule headers_module modules/mod_headers.so
LoadModule cspnonce_module modules/mod_cspnonce.so

# add the CSP_NONCE to the "default-src"
Header add Content-Security-Policy "default-src 'self' 'nonce-%{CSP_NONCE}e';"

下面是一个在脚本中使用nonce的简单示例:

<script nonce="<?= $_SERVER['CSP_NONCE'] ?>">
  var inline = 1;
</script>

这个例子是php,但是你可以使用任何语言。

hlswsv35

hlswsv352#

我宁愿简单地添加这作为一个评论,但我的声誉〈50不允许它,所以我张贴这作为一个答案代替。
回应:
1.)apache通过mod_unique_id生成随机字符串
这是一个“唯一”值,而不是“随机”值,因此在将其用作CSP nonce时可能要小心。
2.)我们将其插入CSP头中(不确定实际如何执行此操作)

<IfModule mod_headers.c>
    <FilesMatch "\.(htm|html|php)$">
        Content-Security-Policy: script-src 'strict-dynamic' 'nonce-%{UNIQUE_ID}e' 'unsafe-inline' ' https:;
    </FilesMatch>
</IfModule>

希望这能帮上忙。

igsr9ssn

igsr9ssn3#

找到mod_unique_id后,这就非常容易了(http://httpd.apache.org/docs/current/mod/mod_unique_id.html)。
1.)启用mod_unique_id。这通常是httpd.conf中的一行:加载模块唯一标识模块modules/mod_unique_id.so
2.)mod_unique_id生成一个唯一的字符串(请参阅user3526609的答案,这对您来说可能足够随机,也可能不够随机),并在每个页面请求时将服务器变量UNIQUE_ID设置为该随机字符串,然后您可以将其注入到您的CSP和任何需要加入白名单的内联代码中。

cyej8jka

cyej8jka4#

nonce必须插入到任何具有内联CSS和/或Javascript处理程序的元素中,因此必须在应用程序层插入。
解析输出HTML并插入nonce会破坏CSP nonce的全部用途--Web服务器无法知道inline CSS/JS是否应该存在,或者它是否由攻击者插入。

cwtwac6a

cwtwac6a5#

在Apache中,你必须启用mod_unique_id模块,它生成一个唯一的环境变量(UNIQUE_ID),但是它的编码中有非法字符csp [A-Za-z 0 -9@-],而不是通常的base64 [A-Za-z 0 -9+/]。
您应该使用base64编码来生成正确的值。例如:

Header set X-Nonce "expr=%{base64:%{reqenv:UNIQUE_ID}}"

然后,要生成完整的CSP策略,请执行以下操作:

Header set Content-Security-Policy "expr=default-src 'self'; script-src 'self' 'nonce-%{base64:%{reqenv:UNIQUE_ID}}'"

在PHP中用途:

echo $_SERVER['HTTP_X_NONCE'];

以提取随机数。

相关问题