mongoose - 破解基于 NodeJS 的 API:如何正确使用 Query.skip() 属性?
问题描述
我正在制作一个 API 中有分页功能的宁静 API,API 的 API 使用者可以提供?page=1&limit=7
一个示例。
确定值的算法(我不确定btw)
skip()
是常量跳过 = 页 * 限制
此处使用了 skip 变量:
theCarsModel.skip(数学.abs(跳过))
我正在使用 Math.abs 强制用户输入为正数,如果给定字符串,它将是 NaN,这似乎没问题并且可以工作
我看到的问题是:
- API 的黑客可能会为页面或限制提供无穷大值,这会导致 mongoose 失败并显示以下错误,但首先这里是如何导致此错误:黑客将发送此 http 查询
http://example.com?page=1&limit=1e10000
- 1e10000 基本上意味着无穷大
{
"status": "Error",
"data": {
"ok": 0,
"code": 2,
"codeName": "BadValue",
"name": "MongoError"
},
"message": "Skip value must be non-negative, but received: -9223372036854775808"
}
- 在我的情况下如何正确使用跳过方法
- 是否有任何可能导致错误的隐藏情况,我尝试过 1e10000,但如果有什么我不知道的,请写在答案中
- 如果有其他字符串可以评估为某些值怎么办,我对 JavaScript 中的这个东西不是很熟悉,所以如果 JavaScript 将某些字符串评估为真实数据类型,那么如果黑客使用可以评估为二进制的字符串怎么办JavaScript 将该字符串评估为一些恶意代码,这可能吗?
解决方案
在数据库查询中使用数据之前,您应该始终对数据进行清理和验证。在这种情况下,您需要创建一个中间件(假设您使用 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();
}
这段代码只是为了给你一个概述。您可以按照自己的风格并根据您的系统要求添加自己的验证。
推荐阅读
- python - 如何在 PyMongo 中打印所有过滤后的元素?
- java - Android for循环等待点击事件计数器然后继续循环
- reactjs - React Router 触发具有历史记录的路由
- c# - EF Core Code-First Migration Cascade删除问题
- node.js - 如何从nodejs子进程中的stderr中提取错误
- android - 带有高级滚动事件的 Flutter webview
- laravel - Laravel 类构造函数必须接受模型集合
- javascript - JS 平滑 setTimeout 类移除
- java - 如何检查字符串是否是base64编码的?
- github - 如何将子文件夹添加到 gitignore 文件?