我应该用 mongoose 验证 get 参数吗

Should I validate get parameter with mongoose

在我的路由中我得到了请求:

router.get('/getOne', auth(), mapController.getOne);

我在 url 中传递 id 参数并在 mapController 中使用 mongoose 进行 mongo 查询,如下所示:

exports.getOne = async(req, res, next) => {
    try {
        const mapData = await Map.findById(req.query.id);
        res.json(mapData);
    } catch (e) {
        return next(e);
    }
};

之前我使用 PHP 进行转义参数以避免 sql 注入。在这里,我没有做任何类似的事情,我只是将 req.query.id 直接传递给 findById 方法。在安全方面,上面的代码是否一切正常?

在这种情况下,Mongoose 会检测到您正在传递一个字符串,并会在内部尝试将其转换为 mongodb ObjectId。如果失败,它将不会 运行 查询。你会得到的错误是:

UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "VALUE HERE" at path "_id" for model "Map"

因此,如您所见,您可以传递一个实际的 mongoDb ObjectId 一个可以转换为一个的有效字符串。其他任何东西都会产生 CastError by Mongoose。