防止用户操纵REST URL

时间:2016-08-10 06:24:48

标签: javascript rest express routing javascript-injection

我正在试图弄清楚如何阻止用户修改URL的漏洞利用 - 例如GET请求。下面的代码是我的Express路由器上的路由,它处理进入集合的传入请求,让我们说为了参数它的集合“A”,并返回该集合中的一些东西。

   router.get("/word/:collection/:language/:amount", function(req, res) {
       getItems(req, res);
   }

现在,如果用户将前端Javascript代码中的URL中的:collection部分更改为“B”,则他将获得集合“B”。我该如何防止这种情况?对于包含userID的集合之类的东西,我可以禁止他们根据req.user访问这些(我认为?)但在这种情况下我不能这样做,因为用户确实需要访问集合A和B,我只是想限制它们在错误的时间进入(不同的页面都需要它们)。

1 个答案:

答案 0 :(得分:1)

包含仅某些用户应该有权访问的信息的休息端点需要受到保护。 (最常见的方法是将API令牌传递给API,oAuth令牌或登录cookie)。如果userA不应该访问collectionB,则需要在该资源中进行检查,并将某种类型的错误代码返回给浏览器。

大多数网站的标准错误都是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);
}

编辑:在重新阅读您的问题后,我现在意识到用户需要在某个时刻访问这两个集合。在这种情况下,您仍然需要实现一些服务器端验证。这是另一个例子(有测验/答案):

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,而不是自动递增数字。这将阻止用户简单地添加/减少以获得不同的测验。