Настройка Helmet и ReportURi?

Я использую Helmet и получаю одно из этих сообщений console.info:

:3000/:48 Отказано в выполнении встроенного скрипта, поскольку он нарушает следующую директиву Политики безопасности контента: «script-src ...»

Я пытаюсь выяснить, какой скрипт блокируется.

У меня есть Helmet, инициализированный с этими параметрами:

const helmetOptions = {
    crossOriginEmbedderPolicy: false,
    contentSecurityPolicy: {
        blockAllMixedContent: true,
        directives: {
            reportUri: '/report-violation',
            defaultSrc: [self],
            scriptSrc: [.....

На моем сервере у меня есть такая настройка для захвата сообщений, отправленных на reportUri:

WebApp.connectHandlers.use('/report-violation', function (req, res, next) {
    debugger;
    const report = req.body;
    console.info('cp #2. Helmet CSP Violation:', report);
    next();
});

Функция сервера задействована, но req.body приходит в неопределенном виде — вот консольный журнал сервера:

КП №2. Нарушение CSP шлема: не определено

КП №2. Нарушение CSP шлема: не определено

Что мне не хватает?

ОБНОВЛЯТЬ

Я проверил, нужно ли мне анализировать тело запроса в формате json, но запрос поступает уже в полях с ключами и значениями, проанализированных в формате json.

Примечание: функция сервера может выглядеть немного странно, но именно так вы получаете доступ к Express в Meteor, моем инструменте сборки. :)

🤔 А знаете ли вы, что...
Node.js поддерживает работу с протоколами HTTP, HTTPS, TCP и UDP.


58
1

Ответ:

Решено

Кажется, это работает:

WebApp.connectHandlers.use('/report-violation', (req, res, next) => {
    // Check if the request method is POST
    if (req.method === 'POST') {
        let report = '';
        req.on('data', chunk => {
            report += chunk;
        });
        req.on('end', () => {
            try {
                // Attempt to parse the report as JSON
                const parsedReport = JSON.parse(report);
                try{
                    let violatedDirective = parsedReport["csp-report"]["violated-directive"]
                    let effectiveDirective = parsedReport["csp-report"]["effective-directive"]
                    let blockedUri = parsedReport["csp-report"]["blocked-uri"]
                    console.info('Helmet CSP Violation: ', blockedUri);
                    console.info('violated-directive: ', violatedDirective);
                    console.info('effective-directive: ', effectiveDirective);
                    console.info('-----');
                }
                catch (Exception){
                    console.info('No blockedUri was found.')
                }

                // Send a response indicating the method is allowed
                res.writeHead(200, { 'Content-Type': 'text/plain' });
                res.end('POST method is allowed for this route.');
            } catch (error) {
                // Handle the case where the report is not valid JSON
                console.error('Error parsing report as JSON:', error);
                res.writeHead(400, { 'Content-Type': 'text/plain' });
                res.end('Bad Request: Invalid JSON');
            }
        });
    } else {
        // If not POST, respond with a 405 status code and include the Allow header
        res.writeHead(405, { 'Content-Type': 'text/plain', 'Allow': 'POST' });
        res.end('Method Not Allowed');
    }
    // No need to call next() here since we're sending a response
});

Примечание. WebApp.connectHandlers Meteor имеют некоторые отличия от Express. Этот код потребует доработок для работы с express.