我来自mysql背景,我知道使用mysql时的典型安全问题。
现在,我正在使用mongodb(java驱动程序)。
有哪些安全问题,以及避免安全问题的可能方法是什么?
特别是这些方面:
1)我是否需要为每个获取/发布做任何事情?
2)我在客户端存储我的应用程序中的cookie并稍后阅读(目前我存储的唯一信息是用户的位置,没有敏感信息),我应该注意什么?
3)我的表单中有文本框,文本区域,用户提交。在mongo中保存数据之前是否需要检查任何内容?
任何人都可以提供生产中现有应用程序的任何安全问题实例吗?
答案 0 :(得分: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 documentation similarly says:
MongoDB查询语言中的字段名称具有语义含义。美元符号(即$)是用于表示运算符的保留字符(即$ inc。)因此,您应该确保应用程序的用户不能将操作符注入其输入。
你也可以从this answer中获得一些价值。
答案 1 :(得分:2)
当你来自mysql背景时,你肯定会考虑SQL注入,并想知道MongoDB是否有类似的东西。
如果您犯了相同的错误,即生成命令作为字符串,然后使用db.command(String)将它们发送到数据库,您将遇到相同的安全问题。但是我读过的MongoDB教程都没有提及这种方法。
当您遵循通常教授的构建DBObjects并将它们传递给适当的方法(如collection.find和collection.update)时,它与在mysql中使用参数化查询相同,从而保护您免受大多数注入尝试。
当然,您需要确保数据库本身已正确配置,以允许未经授权的访问。请注意,MongoDB的开箱即用配置通常不安全,因为它允许从任何地方进行非授权访问。启用身份验证,或确保将网络防火墙配置为仅允许从网络内访问mongodb端口。但这是dba.stackexchange.com
的主题