Я использую 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.
Кажется, это работает:
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.