首页 > 解决方案 > 破解基于 NodeJS 的 API:如何正确使用 Query.skip() 属性?

问题描述

我正在制作一个 API 中有分页功能的宁静 API,API 的 API 使用者可以提供?page=1&limit=7一个示例。

我看到的问题是:

  1. API 的黑客可能会为页面或限制提供无穷大值,这会导致 mongoose 失败并显示以下错误,但首先这里是如何导致此错误:黑客将发送此 http 查询

http://example.com?page=1&limit=1e10000

    {
        "status": "Error",
        "data": {
            "ok": 0,
            "code": 2,
            "codeName": "BadValue",
            "name": "MongoError"
        },
        "message": "Skip value must be non-negative, but received: -9223372036854775808"
    }

  1. 在我的情况下如何正确使用跳过方法
  2. 是否有任何可能导致错误的隐藏情况,我尝试过 1e10000,但如果有什么我不知道的,请写在答案中
  3. 如果有其他字符串可以评估为某些值怎么办,我对 JavaScript 中的这个东西不是很熟悉,所以如果 JavaScript 将某些字符串评估为真实数据类型,那么如果黑客使用可以评估为二进制的字符串怎么办JavaScript 将该字符串评估为一些恶意代码,这可能吗?

标签: mongoose

解决方案


在数据库查询中使用数据之前,您应该始终对数据进行清理和验证。在这种情况下,您需要创建一个中间件(假设您使用 express 作为服务器)来验证您的limit参数。

在您的情况下,单独使用Math.abs是不够的。您需要添加更多验证。

例子 :

路由器.js:

router.get('/resource/:page/:limit',validateRequest,Controller.handleRequest);

验证请求.js:

module.exports = (req,res,next) =>{

  const {page,limit} = req.params;

  if(!page || !limit) return Error;

//Example validations

  if(isNaN(parseInt(limit))) return Error;

  if(parseInt(limit) > MAX || parseInt(limit) < MIN) return Error;

  next();

}

这段代码只是为了给你一个概述。您可以按照自己的风格并根据您的系统要求添加自己的验证。


推荐阅读