如何从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
,我从上面的答案中学到的两件事是:
- 应该是
POST
方法而不是GET
方法 -
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' }));
Express
在csp report
请求处理程序上面添加上面的行之后,明白它应该将具有Content-type的请求parsing为application/csp-report
。
也许Express
默认情况下不parsingapplication/csp-report
,并添加上述解决了我的问题。 我也google了,如果Express
parsingapplication/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