使用Apache 2.4生成随机数(针对内容安全策略标头)

时间:2017-05-13 01:20:13

标签: apache security content-security-policy

我们正在努力创建严格的内容安全策略(https://csp.withgoogle.com/docs/strict-csp.html),这需要Apache在每次请求资源时创建一个nonce,以便我们可以将此nonce插入到http标头中。

我们如何使用Apache 2.4创建一个nonce?

我读过的所有CSP相关文档都说明了“nonce只是一个随机字符串,它是在服务器上生成的,包含在CSP标题中......”但是没有找到任何关于如何用Apache做到这一点。我们当然可以使用应用程序代码执行此操作,但通过Apache执行此操作似乎是一个更清晰的解决方案/将确保每个页面都获得CSP标头。

4 个答案:

答案 0 :(得分:3)

我本来希望只是将其添加为评论,但我的声誉< 50不允许这样做,所以我将其作为答案发布。

回应:

  

1。)apache通过mod_unique_id

生成一个随机字符串

这是一个“唯一”值而非“随机”值,因此您可能需要小心将其用作CSP随机数。

  

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>

我希望这会有所帮助。

答案 1 :(得分:3)

您需要在服务器上生成nonce,然后让Apache将nonce传递到您的脚本中以供使用。

我们为Apache创建了一个开源模块,以简化此过程: mod_cspnonce

这是服务器端配置的简单示例:

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';"

这是在脚本中使用随机数的简单示例:

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

该示例是php,但是您可以使用任何语言。

答案 2 :(得分:2)

找到mod_unique_id后,这很容易(http://httpd.apache.org/docs/current/mod/mod_unique_id.html)。

1。)启用mod_unique_id。这通常是httpd.conf中的一行: LoadModule unique_id_module modules / mod_unique_id.so

2.。mod_unique_id生成一个唯一的字符串(请参阅user3526609的回答,这可能或可能不是随机的)和服务器变量UNIQUE_ID设置等于该随机字符串,在每个页面请求,你可以然后注入您的CSP和白名单所需的任何内联代码。如果您碰巧使用Php,$ _SERVER [&#39; UNIQUE_ID&#39;];

答案 3 :(得分:0)

必须将nonce插入到具有内联CSS和/或Javascript处理程序的任何元素中,因此必须将其插入到应用程序层。

解析输出HTML并插入nonce会破坏CSP nonce的整个目的 - Web服务器无法知道内联CSS / JS是否应该存在,或者是否被攻击者插入。