我正在尝试找出如何防止用户修改 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/