node.js - 如何发送 Reporting API 报告跨域 (Report-To) header

标签 node.js express google-chrome content-security-policy preflight

我有一个 API,用于收集内容安全策略 (CSP) 违规报告。现在 report-uri 已被 report-to 指令取代,我计划使用它。但是,我无法获取跨源报告。我尝试过使用 cors 包。但仍然无法获取报告。

我在客户端源(example-1.com)上设置的 header 是:

res.setHeader(
    'Report-To',
    '{"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url": "https://example-2.com/csp-report"}]}'
);

在 CSP 中,report-to 值设置为 csp-endpoint(这在同一源上工作)

在服务器端(example-2.com),存在以下代码(Express.js 服务器):

app.use(
    '/csp-report',
    express.json({
        type: [
            'application/json',
            'application/csp-report',
            'application/reports+json'
        ]
    })
);

app.use('/csp-report', cors()) // Using cors npm package

app.post('/csp-report', (req, res) => {
    res.setHeader('Access-Control-Expose-Headers', '*, Authorization');
    console.log(req.headers);
    console.log('CSP Violation Timestamp : ' + new Date().getTime());
    console.log(req.body);
    res.status(204).send();
});

我没有收到来自跨源的报告。请认为我是一个初学者,并让我知道我在哪里犯了错误。谢谢。

最佳答案

您的代码似乎是正确的,但目前 Chrome/Chromium 的 Reporting API CORS 实现中存在一个错误,这可能会导致您出现问题。请参阅Chromium issue #1152867 。该错误的要点是,此处使用的 CORS 实现要求响应中存在 Access-Control-Allow-Methods: POST header ,这不符合 CORS 规范,如 POST 是一种“简单”的方法。

如果您能够修改服务器上的 CORS 实现,则可以将其修改为始终在 OPTIONS 上包含 Access-Control-Allow-Methods: POST header > 响应,这应该可以解决该错误。

否则,您将不得不不使用跨域请求进行报告,或者退回到仅使用已弃用的 Report-Uri 指令,直到发布修复程序。后者应该不是什么太大的问题,因为 Firefox 和 Safari 还不支持新的 Report-To header 。

关于node.js - 如何发送 Reporting API 报告跨域 (Report-To) header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70255916/

相关文章:

javascript - 在 PC 浏览器上模拟触摸事件

javascript - socket.io 客户端如何检测我的 Node 服务器端口?

node.js - 更改 SSL 证书的域 - 如 Charles Proxy

node.js - Express 没有设置 cookie

javascript - Node js中未处理的 promise 拒绝错误

google-chrome - 为什么 Chrome 还在缓存这个请求?

javascript - 如何使用 Chrome Extension API 获取网页的所有 HTTP 请求

node.js - SpecReporter 不是 jasmine 上的构造函数错误

javascript - 将值设置为嵌套对象在 Angular 中不起作用

javascript - TypeError : req. checkBody(...).optional(...).isDate 不是函数