在我的路由中,我收到了请求:
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
方法。关于安全性,上述代码是否还不错?
答案 0 :(得分:1)
在这种情况下,Mongoose将检测到您正在传递字符串,并在内部尝试将其转换为mongodb ObjectId。如果失败,将不会运行查询。您将得到的错误是:
UnhandledPromiseRejectionWarning:CastError:转换为ObjectId失败 模型“地图”的路径“ _id”处的值“ VALUE HERE”
如您所见,您可以传递一个实际的mongoDb ObjectId 或,该字符串可以转换为一个有效字符串。猫鼬会产生CastError
。