Как получить тело объекта из запроса в Node.js / Express (для отчетов о нарушениях CSP)? - PullRequest
4 голосов
/ 06 декабря 2011

Я заинтересован в реализации Политики безопасности контента (CSP) для моего приложения Node.js. Документы Mozilla довольно полезны, но я застрял в том, как включить отчеты о нарушениях . Я понимаю основную предпосылку их работы (браузер отправляет запрос POST на указанный URL-адрес, чтобы уведомить веб-сайт о нарушении), но не смог выяснить, где найти документ JSON, описывающий нарушение в HTTP-запросе. Возможно, это было бы очевидно для кого-то более знакомого со спецификацией HTTP.

Глядя на W3C черновик для CSP, я установил, что JSON содержится в части HTTP, называемой «телом сущности». Я до сих пор не знаю, какова цель этой сущности (единственная слегка полезная страница, которую я смог найти по этому вопросу, была одна из спецификации HTTP). Я предполагаю, что это тело запроса.

Возможно, что еще более важно, я не могу найти какой-либо способ получить содержимое тела сущности. Я думал об использовании req.header('entity-body'), но это не работает, поскольку сущность не является заголовком HTTP. Что это такое и как мне его получить?

(Кроме того, я попытался найти учебное пособие по реализации отчетов о нарушениях CSP в Node.js и ничего не нашел. Я нашел один для PHP, но он не был особенно полезен, ссылаясь на file_get_contents('php://input'), который я не делаю есть что-то похожее в Node.js / Express.)

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 06 декабря 2011

Оказывается, я переоценивал вещи. Все, что вам нужно сделать, это включить промежуточное программное обеспечение express.bodyParser() для экспресс-доставки, а затем извлечь req.body в обработчике событий POST. Это возвращает тело HTTP-запроса, содержащего отчет о нарушении JSON.

Включить промежуточное ПО:

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

Получение отчета о нарушении:

server.post('/csp/', function(req, res) {
    console.log(req.body);
});
0 голосов
/ 12 февраля 2016

Я столкнулся с некоторыми трудностями, заставив мое приложение Express выйти с Nginx, чтобы сообщить о csp violations, и две вещи, которые я узнал из вышеприведенного ответа:

  1. Должен быть POST метод иnot GET method
  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 анализирует application/csp-report по умолчанию, и наткнулся на эту gist , утверждая, что Chrome отправляет application/csp-report, тогда как Firefox отправляет application/json (и я использую Chrome - вы можете включить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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...