我想设定一个内容安全政策在 Apache 2.4 上运行的 Joomla 网站的标题。
使用此配置来自 h5bp设置后,Header set Content-Security-Policy "script-src 'self'; object-src 'self'"
Joomla 登录页面(www.example.com/administrator/)显示为空白页。我如何使用此策略并仍然登录?
检查控制台,错误信息为:
内容安全策略:页面的设置阻止了自身资源的加载(“script-srchttp://www.example.com“)。
管理员页面完全由 example.com 提供,没有第三方内容。除了设置了策略的登录页面上的空白页外,该网站运行正常。检查 /administrator 页面源代码,除了没有运行 JS 之外,它看起来完全正常。完整的页面源代码在这里。
因为我已经将 example.com 列入白名单,并使用“script-src‘self’;object-src‘self’”,我预计该页面将会呈现,但我显然遗漏了一些东西。
我现在用新的 VPS 和全新安装的 Joomla 重新测试了这个问题,没有进行任何自定义。设置内容安全策略并重新启动 Apache 会立即重现该问题 - 管理页面完全空白,浏览器中出现控制台错误,抱怨策略阻止资源加载。更改"script-src 'self'
为"script-src 'example.com'
或"script-src 'IP:AD:DR:ESS'
没有帮助,所有脚本都被阻止,就是这样。
知道如何让它工作或者进一步排除故障吗?
答案1
查看源代码后,发现错误消息有误且具有误导性。导致您出现问题的原因是存在多个内联 JavaScript 元素。换句话说,您定义的策略允许如下内容:
<script src="/media/myjsfile.js"></script>
但不是这样的:
<script>function myJsFunction()</script>
为了允许内联 JavaScript (不推荐,因为这违背了使用 CSP 的目的),您需要将您的政策修改为类似以下内容:
script-src 'self' 'unsafe-inline'
或者,你可以重构代码以不使用内联 JS,或者利用nonce 属性。请记住,目前并非所有浏览器都支持 nonce 属性(它是内容安全策略最新规范的一部分)。据我所知,目前只有 Chrome 支持它。