router.use((req, res, next) => {
if(req.originalUrl == '/api/test'){
//does stuff
res.send(result);
}
next();
})
与
route.get('/api/test', (req, res) => {
//does stuff
res.send(result)
}
我对整个HTTP web应用程序的安全行为相当陌生,所以我需要问,如果我使用第一种方法来解决一些路由目的地,是否存在漏洞或缺点?
我对整个HTTP web应用程序的安全行为相当陌生,所以我需要问,如果我使用第一种方法来解决一些路由目的地,是否存在漏洞或缺点?
router.use()
和router.get()
之间有两个主要区别,其中一个在某种程度上与此相关:
-
router.use()
匹配任何http谓词,如GET、POST、PUT、OPTION、PATCH等。而router.get()
只匹配GET请求,router.post()
只匹配POST请求等。 -
CCD_ 6使用";松散的";匹配算法,其中请求的路由只需要从路由上的路径指定开始,而不是完全匹配。
对于第一点,您的中间件处理程序正在为所有请求路径为/api/test
的http谓词执行res.send(response)
。这可能不是您想要的,也不是您应该如何编写代码。您应该让您的代码只响应您实际打算支持的路径的http谓词,并使用它做一些有用的事情。其他动词可能应该以4xx状态代码响应(如果您没有它们的处理程序,这将是Express中的默认状态代码(。
对于第二点,您的中间件处理程序是通用的(没有路径集(,并且您已经在检查整个路径,因此该点不相关。
通过一个小的补充,我认为您的中间件方法很好。我想为req.method
:添加一张支票
router.use((req, res, next) => {
if(req.method === "GET" && req.originalUrl == '/api/test'){
//does stuff
res.send(result);
// return so the rest of the route handler is not executed
// and we don't call next()
return;
}
next();
});
尽管如此,你也可以用一种更通用的方式来解决你的问题。例如,如果您将一个特定的路由定义放在这个中间件前面,那么它将自动从中间件中豁免,因为它将在中间件运行之前得到处理。Express中的路由是匹配的,并按照它们声明的顺序运行。
router.get('/api/test', (req, res) => {
//does stuff
res.send(result)
});
router.use((req, res, next) => {
// do some middleware prep work on all requests that get here
// ...
next();
});
// other route definitions here that can use the results of the prior middleware
例如,如果您有一些路由需要身份验证,而另一些路由则不需要,则这种情况非常常见。您先放置未经身份验证的路由,然后放置身份验证中间件,然后定义要在身份验证检查之后的路由。
没有"精确的";脆弱性,但有很多缺点。这里的主要区别在于,第一段代码是我们称之为";全局处理程序";。它对每个请求都执行。第二部分只是一条特定的路线。
当您提出请求时,express开始评估它需要做的事情的管道,以便返回响应。首先,它执行所有全局处理程序(如第一个示例(。然后,它开始将路由与处理程序列表进行匹配,如果找到了,它就会执行该函数。
使用第一种方法的风险是破坏链,并且不能正确执行所有全局/本地处理程序。其中一些可能会做一些特定的事情(比如防止你受到某种类型的攻击(。然后,使用第二种方法,您定义的不仅仅是全局处理程序:您定义端点和方法(在您的情况下,它是GET
请求(。
当匹配器找到你的路线时,它会自动为你断链(在最简单的情况下(。
还要注意的是,在第一个示例中,您将有一个包含大量if-else
语句的单点来确定您想对这个请求做什么。它基本上减轻了表达的需要。。。
Express是以支持多个";中间件";。如果你想根据一些动作做特定的片段,下面是你可以做的:
router.get('/users',
handler1(req, res, next) {
if (req.something) {
next(); // we skip the logic here, but we go to handler2
} else {
// do your magic
res.send(response);
}
},
handler2(req, res, next) {
// you skipped the action from handler1
res.send(anotherResponse); // you MUST send a response in one handler
}