bom*_*bek 7 security web-config web content-security-policy
我想实现report-uri和report-to在前端应用程序。
报告-uri:
我完成了扩展当前Content-Security-Policy标头值的目标report-uri,这是有效的:
<add name="Content-Security-Policy" value="default-src 'self' 'unsafe-inline' data: google.com; report-uri http://localhost:51260/api/csp/report;"/>
报告给:
按照我理解的说明,我需要添加两件事:新Report-To标题和新指令,Content-Security-Policy因此我已将字符串化的 json 转义为 report-to 并将它们添加到 web.config:
<add name="Report-to" value="{"endpoints":[{"url":"https://localhost:51260/api/csp/report-to"}],"include_subdomains":true,"group":"csp-endpoint","max_age":31536000}" />
<add name="Content-Security-Policy" value="default-src 'self' 'unsafe-inline' data: google.com; report-uri http://localhost:51260/api/csp/report; report-to csp-endpoint;"/>
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
未转义值:
{"endpoints":[{"url":"https://localhost:51260/api/csp/report-to"}],"include_subdomains":true,"group":"csp-endpoint","max_age":31536000}
以供参考:
joe*_*301 13
CSP 有三个版本 ( https://content-security-policy.com )。除了 Internet Explorer,所有现代浏览器都至少实现版本 2。仅实现版本 2(Firefox 和 Safari 是示例)的浏览器使用 report-uri。支持级别 3 的浏览器(例如 Chrome)使用 report-to。如果浏览器支持级别 3,它将使用 report-to 并忽略 report-uri。如果浏览器仅支持级别 2,report-to 可能会在控制台中引发警告(Firefox 会显示警告“内容安全策略:无法处理未知指令 'report-to'”),但不会引发错误.
考虑到这一点,您当前应该同时包含 report-uri 和 report-to 并让浏览器对其进行整理。
从第 3 级开始,报告是使用报告 API ( https://w3c.github.io/reporting ) 实现的。这是目前的草案,因此浏览器可能会以不同的方式实现它。您可以在此处找到有关 Chrome 如何实现此 API 的旧说明:https : //developers.google.com/web/updates/2018/09/reportingapi(我找不到更新的版本,有些示例不再起作用,因为自编写本文档以来 Chrome 已更改)。该文档中的一条特别信息非常有用:“报告是从您的应用程序带外交付的,这意味着浏览器控制何时将报告发送到您的服务器。” 使用 CSP 级别 2,会立即发送报告,而使用 CSP 级别 3,根据浏览器的判断发送报告。这意味着您可能不会立即看到该报告。当我第一次实施 CSP 时,我尝试进行测试并假设报告会立即发送。所以当我使用 Firefox 时,我会看到报告,而当我使用 Chrome 时我没有(我不得不平均等待 30 - 60 秒)。
作为测试工具,在 chrome 中,您可以访问 chrome://net-export 和 https://netlog-viewer.appspot.com跟踪报告。转到 net-export 并选择“开始记录到磁盘”(我只保留默认选项)。选择保存日志文件的位置。然后转到您的网站,该网站应该在违反 CSP 时发送报告。完成后(并检查控制台以确保发生违规),返回并进行网络导出并选择“停止日志记录”。此时,您可以通过转到我提供的第二个链接 (netlog-viewer) 来查看日志文件的内容。打开文件,然后您将在左侧的菜单中看到许多选项。您感兴趣的是“报告”。在屏幕右侧,您将看到“排队报告”。假设报告尚未发送,您将在此处看到 csp-violation(如果报告已发送,则不会发送)。
我说了这么多就是为了说这个,我相信你的代码很好。我在我的一个网站中使用了它并且它有效(我更改了端点 url,但其他一切都相同)。我相信您的问题是尝试在使用本地主机时发送报告。我找不到任何文档来验证此声明(如果其他人这样做,请添加评论),但是在使用 localhost 时我也无法收到报告。我认为这可能是一个安全证书问题(基于这篇文章,报告 API 仅在安全上下文中可用:https : //developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts/features_restricted_to_secure_contexts),但是我将本地主机设置为使用 https,但仍未发送报告。我可以在 Chrome 报告工具中看到报告,但它永远不会被发送。
我希望这会有所帮助,并且其他人可以添加到这个答案中。