防止用户操纵 REST URL
Preventing user manipulation exploit of REST URLs
我想弄清楚我应该如何防止用户修改 URL 的漏洞利用 - 例如 - GET 请求。下面的代码是我的 Express 路由器上的一条路由,它处理进入集合的传入请求,假设为了论证它是集合 "A",并且 returns 来自该集合的一些东西。
router.get("/word/:collection/:language/:amount", function(req, res) {
getItems(req, res);
}
现在,如果用户将前端Javascript代码中URL中的:collection
部分更改为"B",他将获得集合"B".我该如何防止这种情况?对于保存用户 ID 的集合之类的东西,我可以基于 req.user
(我认为?)禁止他们访问这些,但在这种情况下我不能这样做,因为用户确实需要访问集合A和B,我只是想限制他们在错误的时间进入那里(不同页面都需要)。
仅包含某些用户应有权访问的信息的休息端点需要受到保护。 (最常见的方法是将 API 令牌传递给 API、oAuth 令牌或登录 cookie)。如果 userA 不应访问 collectionB,您需要在该资源中进行检查,并 return 向浏览器发送某种类型的错误代码。
大多数网站的标准错误是401: Unauthorized
。这是一个简单的例子:
router.get("/word/:collection/:language/:amount", function(req, res) {
if ( !hasAccess(req.params.userToken) )
{
return res.send(401, {success: false, message: 'no permission'});
}
var collection = req.params.collection,
var language = req.params.language,
var amount = req.params.amount;
return getItems(req, res, collection, language, amount);
}
编辑:重读您的问题后,我现在意识到用户需要在某一时刻访问这两个集合。在这种情况下,您仍然需要实施一些服务器端验证。这是另一个例子(quizzes/answers):
router.get("/quiz/finish/:id", function(req, res) {
//Store that this user has taken this quiz
return recordQuizAnswers(req.params.userToken, req.params.quizAnswers);
}
router.get("/quiz/answers/:id", function(req, res) {
//Has this user taken this quiz?
if ( !hasUserTakenQuiz(req.params.userToken) )
{
return res.send(401, {success: false, message: 'Trying to get the answers before taking the quiz? Cheater...'});
}
return getQuizAnswers(req.params.id);
}
编辑 2:在看到您的评论后,我想到了您可以使用的另一种解决方案。使用 UUID 作为 id 而不是自动递增的数字。这将防止用户简单地 adding/subtracting 获得不同的测验。
我想弄清楚我应该如何防止用户修改 URL 的漏洞利用 - 例如 - GET 请求。下面的代码是我的 Express 路由器上的一条路由,它处理进入集合的传入请求,假设为了论证它是集合 "A",并且 returns 来自该集合的一些东西。
router.get("/word/:collection/:language/:amount", function(req, res) {
getItems(req, res);
}
现在,如果用户将前端Javascript代码中URL中的:collection
部分更改为"B",他将获得集合"B".我该如何防止这种情况?对于保存用户 ID 的集合之类的东西,我可以基于 req.user
(我认为?)禁止他们访问这些,但在这种情况下我不能这样做,因为用户确实需要访问集合A和B,我只是想限制他们在错误的时间进入那里(不同页面都需要)。
仅包含某些用户应有权访问的信息的休息端点需要受到保护。 (最常见的方法是将 API 令牌传递给 API、oAuth 令牌或登录 cookie)。如果 userA 不应访问 collectionB,您需要在该资源中进行检查,并 return 向浏览器发送某种类型的错误代码。
大多数网站的标准错误是401: Unauthorized
。这是一个简单的例子:
router.get("/word/:collection/:language/:amount", function(req, res) {
if ( !hasAccess(req.params.userToken) )
{
return res.send(401, {success: false, message: 'no permission'});
}
var collection = req.params.collection,
var language = req.params.language,
var amount = req.params.amount;
return getItems(req, res, collection, language, amount);
}
编辑:重读您的问题后,我现在意识到用户需要在某一时刻访问这两个集合。在这种情况下,您仍然需要实施一些服务器端验证。这是另一个例子(quizzes/answers):
router.get("/quiz/finish/:id", function(req, res) {
//Store that this user has taken this quiz
return recordQuizAnswers(req.params.userToken, req.params.quizAnswers);
}
router.get("/quiz/answers/:id", function(req, res) {
//Has this user taken this quiz?
if ( !hasUserTakenQuiz(req.params.userToken) )
{
return res.send(401, {success: false, message: 'Trying to get the answers before taking the quiz? Cheater...'});
}
return getQuizAnswers(req.params.id);
}
编辑 2:在看到您的评论后,我想到了您可以使用的另一种解决方案。使用 UUID 作为 id 而不是自动递增的数字。这将防止用户简单地 adding/subtracting 获得不同的测验。