22

我不知道在我的代码中应用以下内容安全策略 (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
    });
});
4

3 回答 3

26

您只需在 HTTP 标头中设置它,而不是在 HTML 中。这是带有静态服务器的 express 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/

希望有帮助!

于 2014-05-29T15:51:30.577 回答
1

如果您使用的是 Express,我建议您看一下头盔。除了增加选项和灵活性(处理 CSP 违规、nonce 等)之外,浏览器实现 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']
  }
}))
于 2020-05-24T21:13:41.043 回答
0

对于使用任何外部框架的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 文档

于 2019-08-12T09:59:34.230 回答