在个别路线上实施头盔 csp

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本身来做到这一点?

Eva*_*ahn 8

此行为内置于 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)

(顺便说一句,我维护头盔,所以如果您有任何反馈,请告诉我!)


jas*_*nny 5

自定义中间件能够更改标头,只需将其添加到 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)