【发布时间】:2021-09-21 09:23:49
【问题描述】:
我正在通过report-to 指令发送 CSP 报告:
app.use(express.json({
type: [
"application/json",
"application/csp-report",
"application/reports+json"
]
}));
const _reportCSP = {
endpoints: [
{
url: "https://myapp.com/reportCSP"
}
],
group: "csp-endpoint",
include_subdomains: true,
max_age: 31536000
};
res.setHeader("content-security-policy", `default-src 'none'; script-src https://*.someHost.com 'self' 'unsafe-eval' 'unsafe-inline'; style-src https://*.someHost.com 'self'; font-src https://*.someHost.com 'self'; img-src 'self'; connect-src https://*.someHost.com https://*.dropboxapi.co 'self'; frame-ancestors 'none'; report-to ${reportCSP.group};`);
res.setHeader("report-to", JSON.stringify(reportCSP));
URL https://*.dropboxapi.co 仅用于 CSP 报告测试目的。
基于this 示例,我按以下方式处理 CSP 报告请求:
function echoReports(request, response) {
for (const report of request.body) {
console.log(`Report content: ${report}`);
console.log(`Report content: ${JSON.stringify(report)}`);
}
}
app.post("/reportCSP",
async (req, res) => {
console.log(`${req.body.length} CSP violation reports:`);
echoReports(req, res);
}
);
结果,我进入了服务器端:
1 CSP violation reports:
Report content: [object Object]
Report content: "[object Object]"
在 DevTools 中我看到了正确的错误报告:
Refused to connect to 'https://content.dropboxapi.com/…' because it violates the following Content Security Policy directive: "connect-src https://*.someHost.com https://*.dropboxapi.co 'self'"
Refused to connect to 'https://content.dropboxapi.com/…' because it violates the document's Content Security Policy.
JSON.stringify(request) 内部的echoReports(req, res) 导致:
TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Socket'
| property 'parser' -> object with constructor 'HTTPParser'
--- property 'socket' closes the circle
at JSON.stringify (<anonymous>)
at echoReports (file:///app/src/server/app.mjs:2949:33)
由于我使用的是 Express.js 4.17.1,因此我不使用 body-parser,而是使用 express.json(…)。
我尝试了几种方法在服务器端打印 CSP 报告的内容,但没有成功。
当然,任何反横幅、安全和隐私保护软件都已停用。
附:我已经详细阐述了这个问题,以便更清楚地说明我要解决的问题是什么。
【问题讨论】:
-
你的
connect-src指令的值没有错字吗?https://*.dropboxapi.co不应该是https://*.dropboxapi.com吗? -
@jub0bs,打错字是检查 CSP
report-to,一旦我弄清楚如何获取报告,我会修复它。 -
${policyViolationReport.group}计算结果为"policyViolationReport",而不是"/policyViolationReport"。report-to ${policyViolationReport.group}中的前导斜杠应该来自哪里? -
我假设
${policyViolationReport.group}引用group: "policyViolationReport",这意味着${policyViolationReport.group}="policyViolationReport"。该组应该以/开头吗? -
我不知道组应该是什么,但是
report-to指令的值绝对不应该是policyViolationReport。尝试在 CSP 标头中硬编码/policyViolationReport,看看是否有任何改变。