我正在为查询 MongoDB 数据库的服务构建 REST API。最初,我采用提供“/user/1”的标准路线来搜索用户 id 1 等。随着我对项目的深入了解,其他开发人员开始询问我们是否可以添加 bool 搜索功能,例如能够做到“和”、“非”和“或”。考虑到为此创建 DSL 所需的工作量,我想到让 REST API 接受一个 MongoDB 查询 JSON 对象,就像这样(假设这是通过 POST 传递的):
/query/{"$or": [{"user": "1", "user", "2"}]}
现在,在将该查询传递给 MongoDB 之前,我将执行以下操作:
- 验证 JSON 对象
- 确保字符串仅用于
query
函数,而不是update
、runcommand
或aggregation
- 验证查询中没有
$where
子句,since that allows script execution
这样做是否足以防止注入(inject)?阅读 MongoDB FAQ ,似乎将 JSON 传递给查询操作是无害的,因为您不能使用它运行任何 javascript($where 除外)。这是一种安全的方法吗?
最佳答案
正如您已经注意到的,由于 JSON 解析的性质意味着 MongoDB 不会像使用允许 SQL 传递的 API 那样对相同类型的“脚本”注入(inject)攻击开放。
对于您的观点2。常识方法是仅将某些操作作为端点。比如 query
或者 with update
基本上都需要对客户端执行的操作进行认证。因此,您不会向 API 公开具有潜在危险的操作。
还需要考虑一般身份验证和角色。因此,您只允许 API 执行其呈现的“角色”允许的操作。这可以为您提供更多保护,而不必在您的代码中检查这一点,或者至少只是从“未经授权”的操作中捕获错误。
最后将 3. 作为检查提供的查询中是否存在 $where
运算符的可能替代方法(尽管存在限制您可以在每个版本中做得更好),您实际上可以使用 --noscipting
在服务器上关闭它选项。
因此,您确实可以采取很多保护措施来帮助您避免“脚本注入(inject)”攻击,但一般来说,不存在相同类型的危险。
关于mongodb - 通过 REST API 公开 mongodb 查询是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23821655/