面试题答案
一键面试常见安全性问题
- 注入攻击
- 描述:类似于SQL注入,攻击者利用用户输入,构造恶意的查询语句,从而执行非预期的数据库操作,比如恶意插入、删除或查询敏感数据。例如,在使用动态构建的查询字符串时,如果没有对用户输入进行适当的过滤,攻击者可以修改查询逻辑。
- 示例:假设应用程序根据用户输入的用户名来查询用户信息,若代码像这样
var query = { username: req.body.username }; db.users.find(query);
,攻击者可以输入admin' || 1 == 1
,这样查询条件就会变为{ username: 'admin' || 1 == 1 }
,导致查询返回所有用户数据。
- 权限滥用
- 描述:如果数据库用户被赋予了过高的权限,可能会意外或故意地执行一些危险操作,比如删除整个集合或数据库。例如,一个普通的应用程序用户被错误地赋予了管理员权限,那么他就可以对数据库进行任何操作。
- 未授权访问
- 描述:如果MongoDB的访问控制配置不当,可能会导致未授权的用户能够访问数据库。这可能是由于默认端口开放在公网且没有设置认证机制,或者认证信息泄露等原因。
防范措施
- 防止注入攻击
- 使用参数化查询:在Node.js(使用
mongodb
驱动)中,使用参数化查询的方式,而不是直接拼接用户输入到查询语句中。例如var query = { username: req.body.username }; db.users.find(query).toArray(function(err, docs) { /* 处理结果 */ });
,驱动会自动处理输入,防止恶意注入。 - 输入验证:在应用程序层面,对用户输入进行严格的验证,确保输入的数据类型和格式符合预期。比如使用正则表达式验证用户名只能包含字母和数字等。
- 使用参数化查询:在Node.js(使用
- 权限管理
- 最小权限原则:为每个数据库用户分配执行其任务所需的最小权限。例如,一个只需要查询数据的用户,只应被赋予读权限,而不是读写甚至管理员权限。
- 定期审查权限:定期检查数据库用户的权限设置,确保没有用户被赋予了不必要的过高权限。
- 访问控制
- 启用身份验证:配置MongoDB启用用户名和密码认证,确保只有授权的用户可以访问数据库。可以通过在
mongod
配置文件中设置security.authorization: enabled
,并创建用户来实现。 - 网络安全配置:限制MongoDB服务器的网络访问,避免将其直接暴露在公网上。可以通过防火墙配置,只允许受信任的IP地址访问MongoDB的端口。
- 启用身份验证:配置MongoDB启用用户名和密码认证,确保只有授权的用户可以访问数据库。可以通过在