javascript - 防止用户操纵 REST URL

标签 javascript rest express routes javascript-injection

我正在尝试找出如何防止用户修改 GET 请求的 URL 的漏洞。下面的代码是我的 Express 路由器上的一条路由,它处理进入集合的传入请求,为了便于论证,我们假设它是集合“A”,并返回该集合中的一些内容。

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

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

最佳答案

包含只有某些用户有权访问的信息的其余端点需要受到保护。 (最常见的方法是将 API token 传递给 API、oAuth token 或登录 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,而不是自动递增的数字。这将防止用户简单地添加/减去以获得不同的测验。

关于javascript - 防止用户操纵 REST URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38865730/

相关文章:

javascript - 如何在java中发送响应期间压缩Rest服务中的数据(对象)

c# - WCF 的 RESTful Web 服务示例

javascript - ssl 版本或密码不匹配 ExpressJS

node.js - React 中的不同页面服务是如何工作的?

javascript - 如果选中复选框,则将值分配给旁边的输入字段

javascript - 样式加载器未在我的 <head> 中加载 css

java - 404 错误,Jersey 2.x on tomcat 8

node.js - 如何在多个路由中使用nodejs提供静态文件

javascript - IE 中 iframe 元素的线程

javascript - 如何在 Flare React 包中实现类 Controller 选项