【问题标题】:Preventing user manipulation exploit of REST URLs防止用户操纵 REST URL
【发布时间】:2016-08-10 06:24:47
【问题描述】:

我正试图弄清楚我应该如何防止用户修改 GET 请求的 URL 的漏洞。下面的代码是我的 Express 路由器上的一个路由,它处理进入集合的传入请求,我们假设它是集合“A”,并从该集合返回一些东西。

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

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

【问题讨论】:

    标签: javascript rest express routing javascript-injection


    【解决方案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's 作为 id 而不是自动递增的数字。这将防止用户简单地通过加/减来获得不同的测验。

    【讨论】:

    • 谢谢。虽然这不是我的意思,但我认为。这更像是“如果我必须获取特定测验的数据,而一般用户可以使用多个测验”并且有一个看起来像这样的 .get:“router.get(”/quiz/:quizID /answers/", function(req, res)...." 如果我​​操纵“quizID”,我将得到错误测验的答案。用户可以访问这两个测验,我只是不想让他搞砸使用 URL 并在错误的时间获取错误的 URL。
    • 嗯,但是如果我理解正确的话,如果我转到页面 A,我仍然可以利用它,记下我用于该集合的 UUID,转到页面 B,更改 Javascript 中的 UUID并获取页面 A 的集合。
    • 但是你想从我这里得到什么?他们可以访问这两种资源......如果他们转到一个页面,他们可以简单地下载该页面上的所有内容,然后返回到另一个页面。他们甚至不需要在另一个页面上提出另一个请求。
    • 在那种情况下,也许我想要一些不可能的东西。我想我想将某人“锁定”到某个页面。防止他们在与用户不相关的时候查询集合,而只在需要时查询集合。
    • “锁定它们”由于我之前评论中的原因不起作用。他们可以简单地下载结果,转到另一个页面,然后访问他们本地保存的数据。话虽这么说:您可以生成一次性使用令牌,您必须将其传递回页面上的回调。获取数据后,清除令牌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2012-10-07
    • 2015-05-26
    相关资源
    最近更新 更多