微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我将 app.use(helmet... 放在 app.use 语句中的位置是否重要?

如何解决我将 app.use(helmet... 放在 app.use 语句中的位置是否重要?

我有一个 node.js 应用程序,我在其中使用了多个 app.use 语句。我想包含 app.use(helmet.frameguard({ action: 'deny' })); 行以通过阻止我的网站出现在 iframe 中来防止点击劫持,我想问一下我在 app.use 语句的顺序中放置此行的位置是否重要?我是否需要将它放在所有其他 app.use 语句中的特定位置(例如 app.use(cookie-parser());

解决方法

我的意思是,所有中间件都一行一行地运行,或者您可以说是同步运行。

只要确保你应该把它放在路由初始化之上(因为如果它去路由,你可能只从那里返回函数响应,所以它不会去下一个中间件,因为响应已经发送)。可以将其粘贴到 cookie-parser 的上方或下方。

,

总结:我建议将 helmet() 放在首位。

头盔维护者在这里。这与其说是头盔问题,不如说是一个 Express 问题。

Express 应用按顺序运行它们的中间件。例如,以下将为每个请求打印 foo,然后是 bar

function fooMiddleware(req,res,next) {
  console.log("foo");
  next();
}

function barMiddleware(req,next) {
  console.log("bar");
  next();
}

app.use(fooMiddleware);
app.use(barMiddleware);

// ...

或者,这将打印 bar,然后是 foo

app.use(barMiddleware);
app.use(fooMiddleware);

因此,如果您希望 Helmet 的标头应用于所有响应,请将它们放在首位非常重要。

例如,这将为每个请求设置 Helmet 标头:

const app = express();

app.use(helmet());

// ...

但这个可能不会,因为静态文件中间件可能会先获取它:

const app = express();

app.use(express.static("./static_files"));

app.use(helmet());

// ...

值得注意的是,路由处理程序(如 app.get('/foo'))在概念上与中间件非常相似。这两个代码片段几乎相同(尽管您应该在实际应用程序中使用前者):

app.get("/foo",(req,res) => {
  res.send("Hello world!");
});
app.use((req,next) => {
  if (req.method === "GET" && req.url === "/foo") {
    res.send("Hello world!");
  } else {
    next();
  }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。