nodeJS — куда именно я могу поставить Content Security Policy

Я не знаю, где применить приведенный ниже фрагмент политики безопасности контента (CSP) в моем коде;

Content-Security-Policy: script-src 'self' https://apis.google.com

Это должно быть в HTML?

Будет ли это лучше всего реализовано в JavaScript, как показано в приведенном ниже фрагменте кода?

var policy = "default-src 'self'";
http.createServer(function (req, res) {
    res.writeHead(200, {
        'Content-Security-Policy': policy
    });
});

person user2520410    schedule 10.01.2014    source источник


Ответы (3)


Вам просто нужно установить его в заголовке HTTP, а не в HTML. Это рабочий пример с экспрессом 4 со статическим сервером:

var express = require('express');
var app = express();


app.use(function(req, res, next) {
    res.setHeader("Content-Security-Policy", "script-src 'self' https://apis.google.com");
    return next();
});

app.use(express.static(__dirname + '/'));

app.listen(process.env.PORT || 3000);

Если вам нужна дополнительная информация о CSP, вот отличная статья: http://www.html5rocks.com/en/tutorials/security/content-security-policy/

Надеюсь, это поможет!

person Juan Manuel Arias    schedule 29.05.2014
comment
Если это поможет, вот мой уровень промежуточного программного обеспечения Express, который я использую для установки заголовков CSP таким образом, чтобы его было легко обновлять - medium.com/@mdp/csp-in-express-js-node-157d040f2f00 - person Mark Percival; 13.10.2015
comment
Когда вы устанавливаете заголовок в узле, как показано в этом ответе, влияет ли это на клиентскую сторону js-запросы к третьим сторонам, т.е. может ли он блокировать и разрешать получение запросов, сделанных из браузера, на сторонний сайт? или это применяется только к js на стороне сервера? (также кажется, что вы можете установить CSP в <head> html-документа - content-security-policy.com/examples/meta - но я не уверен, что это лучший подход, в мой случай, директивы в секции <head> просто не применяются) - person user1063287; 30.08.2020
comment
Обновите, чтобы ответить на вопрос в моем комментарии выше - да, установка заголовков CSP в приложении узла также влияет на поведение js на стороне клиента, как показано в моем ответе здесь. - person user1063287; 30.08.2020

Для приложения node.js без использования какой-либо внешней среды, например. express:

const http = require('http');

http.createServer((request, response) => {

    request.on('error', (err) => {
        console.error(err);

    // for this simple example I am not including the data event
    // e.g. if the request contains data in the body

    }).on('end', () => {

       response.on('error', (err) => {
           console.error(err);
       });

      // you can set your headers with setHeader or 
      // use writeHead as a "shortcut" to include the statusCode. 
      // Note writeHead won't cache results internally
      // and if used in conjuction with setHeader will take some sort of "precedence"

      response.writeHead(200, {
          "Content-Security-Policy": "default-src 'self'"

           // other security headers here...
      });

      response.end("<html><body><h1>Hello, Security Headers!</h1></body></html>");

  });
}).listen(8080);

Подробнее о настройке заголовков для объекта ответа см. в документации по node.js.

person rags2riches    schedule 12.08.2019

Если вы используете Express, я предлагаю взглянуть на шлем. Помимо расширенных возможностей и гибкости (обработка нарушений CSP, одноразовых номеров и т. д.), существует множество несоответствий в том, как браузеры реализуют CSP. Helmet просматривает пользовательский агент браузера и устанавливает соответствующий заголовок и значение для этого браузера. Если ни один пользовательский агент не соответствует, он установит все заголовки со спецификацией 2.0.

// Make sure you run "npm install helmet-csp" to get the csp package.
const csp = require('helmet-csp')

app.use(csp({
  directives: {
    defaultSrc: ["'self'"],
    styleSrc: ["'self'", 'maxcdn.bootstrapcdn.com']
  }
}))
person Kevin Farrugia    schedule 24.05.2020