我不知道在我的代码中应用以下内容安全策略(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
});
});
答案 0 :(得分:7)
您只需要在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/
希望有所帮助!
答案 1 :(得分: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);
See the node.js documentation有关在响应对象上设置标题的更多详细信息
答案 2 :(得分:0)
如果您使用的是Express,我建议您看看helmet。除了增加的选项和灵活性(处理违反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']
}
}))