new*_*rey 3 node.js express content-security-policy helmet.js
我正在创建一个示例 Express 应用程序来演示 Content-Security-Policy (CSP) 标头,并尝试使用helm-csp。
头盔 csp 的所有文档都显示它用作标准的第三方中间件通过app.use(csp({ ... }))- 这将 CSP 标头添加到我的应用程序中的每个路由,但我想在单个路由上对其进行自定义。
示例应用程序
var express = require('express');
var http = require('http');
var csp = require('helmet-csp');
var app = express();
app.use(csp({
directives: {
frameSrc: ["'none'"]
}
}));
app.get('/', (request, response) => {
response.send('hi, :wave: =]');
});
app.get('/frameable', (request, response) => {
response.send('you can frame me!');
});
http.createServer(app).listen(80, (err) => {
if (err) {
return console.log('error', err);
}
});
Run Code Online (Sandbox Code Playgroud)
有了上面的内容,每条路由都会收到 CSP 标头:
内容安全策略:frame-src 'none'
在/frameable路由中,我希望将此 CSP 标头覆盖为:
内容安全策略:frame-src 'self'
每当我需要/想要在每个路由的基础上自定义由头盔 csp 设置的标头时,我是否需要在每个标头中手动覆盖它们app.get,例如:
response.setHeader('Content-Security-Policy', "frame-src 'self'");
Run Code Online (Sandbox Code Playgroud)
或者有没有办法通过头盔csp本身来做到这一点?
此行为内置于 Express 中。
Express 允许您为每个路由指定多个请求处理程序。由于csp回复路由处理,你可以前加入你的路由处理:
app.get('/frameable', csp({
directives: {
frameSrc: ["'self'"]
}
}), (request, response) => {
response.send('you can frame me!');
});
Run Code Online (Sandbox Code Playgroud)
如果你更喜欢把事情分开一点,你可以做这样的事情:
var normalCspHandler = csp({
directives: {
frameSrc: ["'none'"]
}
});
var frameSelfCspHandler = csp({
directives: {
frameSrc: ["'self'"]
}
});
app.use(normalCspHandler);
app.get('/frameable', frameSelfCspHandler, (request, response) => {
response.send('you can frame me!');
});
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,我维护头盔,所以如果您有任何反馈,请告诉我!)
自定义中间件能够更改标头,只需将其添加到 use(csp)
app.use(function (req, res, next) {
if (req.url == '/frameable') {
res.set('Content-Security-Policy', 'frame-src \'self\'');
}
next();
});
Run Code Online (Sandbox Code Playgroud)
您还可以链接中间件,因为它是一个返回函数的函数:
app.use(function (req, res, next) {
var middleware;
if (req.url == '/frameable') {
middleware = csp({
directives: {
frameSrc: ["'self'"]
}
});
} else {
middleware = csp({
directives: {
frameSrc: ["'none'"]
}
});
}
middleware(req, res, next);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2181 次 |
| 最近记录: |