Javascript nodeJS-我可以将内容安全策略放在哪里

Javascript nodeJS-我可以将内容安全策略放在哪里,javascript,html,node.js,content-security-policy,Javascript,Html,Node.js,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, { 'C

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

您只需要在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的更多信息,这是一篇优秀的文章:


希望有帮助

对于不使用任何外部框架(如
express
)的
node.js
应用程序

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);
consthttp=require('http');
http.createServer((请求、响应)=>{
请求.on('error',(err)=>{
控制台错误(err);
//对于这个简单的示例,我不包括数据事件
//例如,如果请求正文中包含数据
}).on('end',()=>{
响应.on('error',(err)=>{
控制台错误(err);
});
//您可以使用setHeader或
//将writeHead用作包含状态代码的“快捷方式”。
//注意writeHead不会在内部缓存结果
//如果与setHeader结合使用,则将具有某种“优先级”
书面答复(200{
“内容安全策略”:“默认src‘self’”
//其他安全头在这里。。。
});
response.end(“你好,安全标题!”);
});
}).听(8080);

有关在响应对象上设置标题的更多详细信息(如果您使用的是Express),我建议查看。除了增加了选项和灵活性(处理CSP冲突、nonce等),浏览器如何实现CSP还有很多不一致之处。头盔查看浏览器的用户代理,并为该浏览器设置适当的标题和值。如果没有匹配的用户代理,它将使用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']
  }
}))

在本帮助中,我使用Express中间件层以易于更新的方式设置CSP头-当您在节点中设置头时(如本答案所示),这是否会影响客户端对第三方的js请求,即它是否可以阻止并允许从浏览器向第三方站点发出get请求?或者它只适用于服务器端js?(另外,您似乎可以在html文档的
中设置CSP,但我不确定这是否是最好的方法,
部分中的指令根本没有被应用)更新以回答我上面评论中的问题-是的,在node app中设置CSP头也会影响客户端js行为,如中所示。