2

我来自 mysql 背景,我知道使用 mysql 时典型的安全问题。

现在,我正在使用 mongodb(java 驱动程序)。

有哪些安全问题,以及避免安全问题的可能方法是什么?

特别是这些领域:

1)我需要为每个获取/发布做任何事情吗?

2)我将应用程序中的cookie存储在客户端并稍后读取(目前我存储的唯一信息是用户的位置,没有敏感信息),我应该注意什么?

3) 我的表单中有用户提交的文本框和文本区域。在 mongo 中保存数据之前我需要检查任何东西吗?

任何人都可以提供生产中现有应用程序的任何安全问题实例吗?

4

2 回答 2

4

事实上,使用 Mongo 执行注入是可能的。我的经验是在 Ruby 中,但请考虑以下几点:

Request: /foo?id=1234
id = query_param["id"]
collection.find({_id: id})
# collection.find({_id: 1234})

看起来很无害,对吧?但是,根据您的 HTTP 库,您最终可能会将某些查询字符串解析为数据结构:

Request: /foo?id[$gt]=0
# query_param["id"] => {"$gt": 0}
collection.find({_id: id})
# collection.find({_id: {"$gt": 0}})

这在强类型语言中可能不太危险,但仍然需要提防。

这里的典型补救措施是确保您始终将入站参数数据转换为您期望的类型,并在您不匹配类型时严重失败。这适用于 cookie 数据以及来自不受信任来源的任何其他数据;激进的强制转换将防止聪明的用户通过传入运算符哈希而不是值来修改您的查询。

MongoDB 文档同样说:

MongoDB 查询语言中的字段名称具有语义含义。美元符号(即 $)是用于表示运算符(即 $inc)的保留字符。因此,您应该确保应用程序的用户不能将运算符注入到他们的输入中。

您还可以从这个答案中获得一些价值。

于 2013-07-27T06:47:25.850 回答
2

关于编程:

当您来自 mysql 背景时,您肯定会考虑 SQL 注入,并想知道 MongoDB 是否有类似的东西。

当你犯了同样的错误,将命令生成为字符串,然后使用db.command(String)将它们发送到数据库,你将遇到同样的安全问题。但是我读过的任何 MongoDB 教程都没有提到这种方法。

当您遵循构建 DBObjects 并将它们传递给适当的方法(如 collection.find 和 collection.update)的通常教学实践时,它与在 mysql 中使用参数化查询相同,从而保护您免受大多数注入尝试。

关于配置:

当然,您需要确保正确配置数据库本身以不允许未经授权的访问。请注意,MongoDB 的开箱即用配置通常是不安全的,因为它允许从任何地方进行未经授权的访问。要么启用身份验证,要么确保您的网络防火墙配置为仅允许从网络内访问 mongodb 端口。但这是dba.stackexchange.com的主题

于 2013-07-27T06:08:37.637 回答