我们正在努力创建严格的内容安全策略(https://csp.withgoogle.com/docs/strict-csp.html),这需要Apache在每次请求资源时创建一个nonce,以便我们可以将此nonce插入到http标头中。
我们如何使用Apache 2.4创建一个nonce?
我读过的所有CSP相关文档都说明了“nonce只是一个随机字符串,它是在服务器上生成的,包含在CSP标题中......”但是没有找到任何关于如何用Apache做到这一点。我们当然可以使用应用程序代码执行此操作,但通过Apache执行此操作似乎是一个更清晰的解决方案/将确保每个页面都获得CSP标头。
答案 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是否应该存在,或者是否被攻击者插入。