4

我有兴趣为我的 Node.js 应用程序实施内容安全策略 (CSP)。Mozilla 的文档很有帮助,但我被困在如何启用违规报告上。我了解它们如何工作的基本前提(浏览器向指定的 URL 发送 POST 请求以通知网站违规),但无法弄清楚在哪里可以找到描述 HTTP 请求中违规的 JSON 文档。也许这对于更熟悉 HTTP 规范的人来说是显而易见的。

查看 CSP的W3C 草案,我确定 JSON 包含在 HTTP 的一部分中,称为“实体主体”。我仍然不知道该实体的目的是什么(我能找到的关于此事的唯一稍微有用的页面是来自 HTTP 规范的页面)。我假设它是请求的主体。

也许更重要的是,我找不到任何方法来检索实体主体的内容。我想过使用req.header('entity-body'),但这不起作用,因为实体不是 HTTP 标头。它是什么以及如何获取它?

(此外,我尝试查找有关如何在 Node.js 中实现 CSP 违规报告的教程,但一无所获。我确实找到了一个用于 PHP 的教程,但它并不是特别有用,引用了一个file_get_contents('php://input')我在 Node 中没有类似的东西.js/快递。)

任何帮助将不胜感激。

4

2 回答 2

4

事实证明我过度分析了事情。您需要做的就是express.bodyParser()为 express 启用中间件,然后req.body在 POST 事件处理程序中获取。这将检索包含 JSON 违规报告的 HTTP 请求的正文。

启用中间件:

var server = express.createServer(
    // other middleware here
    express.bodyParser()
);

检索违规报告:

server.post('/csp/', function(req, res) {
    console.log(req.body);
});
于 2011-12-06T08:04:01.693 回答
1

Express我在让我的应用程序使用 Nginx 进行报告时遇到了一些困难,我csp violations从上述答案中学到的两件事是:

  1. 应该是POST方法而不是GET方法
  2. req.body包含报告

但是,以上还不够,我一直空着req.body,我找不到任何其他帖子来描述如何解决它。经过一些研究后,我发现了这篇文章以及一个完全孤立的 github问题,其中dougwilson给出了将处理csp report.

对我来说是空的原因req.body是因为我csp report在以下配置之后放置了路由处理程序:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());

我将csp report路由处理程序移到这些上面,但是我仍然保持空白,req.body然后我添加了以下上述csp report路由处理程序以获取报告req.body

app.use(bodyParser.json({ type: 'application/csp-report' }));

csp report在请求处理程序上方添加上述行后,Express了解它应该解析 Content-type 为 的请求application/csp-report

也许Express默认情况下不解析application/csp-report,添加上面的内容为我解决了这个问题。如果默认Express解析,我也用谷歌搜索,我发现这个要点声称发送,而 Firefox 发送(我使用的是 Chrome -如果你遇到问题,你也可以包括在内)。application/csp-reportChromeapplication/csp-reportapplication/jsonapplication/jsonFF

所以这就是我的样子app.js

// without following csp-report don't get parsed.
app.use(bodyParser.json({ type: 'application/csp-report' }));

app.get('/vehicle/cspreport', function(req, res) {
  res.status(403);
});

app.post('/vehicle/cspreport', function(req, res) {
  console.log('csp report > ' + JSON.stringify(req.body));
});

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
...

OP 发布的已接受答案来自2011,我想添加一个答案以显示我如何2016使用以下版本的 Node.js、Express 和 Nginx解决此问题

Node: v4.2.4
Express: 4.13.1 
Nginx: 1.8.1  
于 2016-02-11T22:05:12.183 回答