如何从Node.js / Express中的请求中检索实体正文(针对CSP违规报告)?

我有兴趣为我的Node.js应用程序实现内容安全策略(CSP)。 Mozilla的文档相当有帮助,但我坚持如何启用违规报告 。 我了解他们如何工作的基本前提(浏览器向指定的URL发送POST请求以通知网站违规),但无法find在HTTP请求中find描述违规的JSON文档的位置。 也许这对于更熟悉HTTP规范的人来说是显而易见的。

看看CSP的W3C草案 ,我确定了JSON包含在称为“实体主体”的HTTP部分中。 我仍然不知道这个实体的目的是什么(我能find的唯一有用的页面是来自HTTP规范的)。 我假设它是请求的主体。

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

(另外,我试图find一个关于如何在Node.js中实现CSP违规报告的教程,并没有发现任何东西。我确实find了一个PHP,但它并没有特别有用,引用了一个file_get_contents('php://input')我在Node.js / Express中没有类似的东西。)

任何援助将不胜感激。

原来我过分分析的东西。 您只需启用express.bodyParser()中间件,然后在POST事件处理程序中获取req.body 。 这将检索包含JSON违例报告的HTTP请求的正文。

启用中间件:

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

检索违规报告:

 server.post('/csp/', function(req, res) { console.log(req.body); }); 

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

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

但是,以上是不够的,我一直得到空req.body ,我找不到任何其他职位来描述如何解决它。 经过一些研究,我发现这个post以及一个完全孤立的github 问题 ,其中dougwilson提供了处理csp report的路线。

req.body对我来说是空的原因是因为我在以下configuration后放置了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' })); 

Expresscsp report请求处理程序上面添加上面的行之后,明白它应该将具有Content-type的请求parsing为application/csp-report

也许Express默认情况下不parsingapplication/csp-report ,并添加上述解决了我的问题。 我也google了,如果Expressparsingapplication/csp-report默认情况下,我碰到这个要求,声称Chrome发送application/csp-report而Firefox发送application/json (和我使用的是铬 – 你也可以包括application/json如果你面对FF问题)。

所以这就是它在我的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