我读了一本关于Reimongly和trusty的书.

凭直觉,我想我明白这一点.如果未初始化的VAR被传递到查询中,它们就无法用UNIONJOIN、由查询转换的注释等打破面向文档的查询 struct .

MongoDB如何避免SQL注入混乱?这仅仅是因为这种查询语法的性质吗?

推荐答案

MongoDB通过不解析避免了潜在的问题.

任何涉及将用户数据编码为被解析的格式化文本的API,无论在何处,都有可能导致调用者和被调用者在该文本的解析方式上产生分歧.当数据被误解为元数据时,这些分歧可能是安全问题.无论您谈论的是printf格式的字符串,包括HTML中用户生成的内容,还是生成SQL,都是如此.

由于MongoDB不会解析 struct 化文本以确定要做什么,因此不可能将用户输入误解为指令,因此不存在可能的安全漏洞.

顺便提一下,避免使用需要解析的API的建议是http://cr.yp.to/qmail/guarantee.html中的第5项.如果你对编写安全软件感兴趣,其他6条建议也值得一看.


更新(2018):据我所知,我给出的原始答案仍然是真实的.从发送给MongoDB的内容到发送回的内容,不存在SQL注入攻击.据我所知,注入攻击发生在MongoDB之外,实际上是外部语言和库如何设置将传递给MongoDB的数据 struct 的问题.此外,漏洞的位置在于如何在数据成为数据 struct 的过程中解析数据.因此,最初的答案准确地描述了如何避免注射攻击,以及什么会让你面临注射攻击的风险.

但对于一个程序员来说,这种精确性是一种冷淡的安慰,他受到了注入攻击,这些攻击来自于他们自己的代码中不明显的缺陷.我们中很少有人区分外部工具和代码与外部工具之间的所有层.事实仍然是,我们需要保持警惕,以预测和阻止注射攻击.用各种工具.在可预见的future ,情况依然如此.

Sql相关问答推荐

SQL—如何根据2列填写缺失的值

Oracle SQL-将结果列在单行中

SQL基于多个值 Select 单行

当交叉联接3个或更多表时,实体框架中是否会传输冗余的行数据并占用数据库带宽?

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

SQL子查询返回多个值错误

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

带上最后日期(结果)

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

组合2个分区表的postgres视图的执行计划正在访问所有分区

每次计数器增加时通过运行总重置进行分组

如何将输出转换为二维格式?

基于 Snowflake 的最大值创建新列

如何将 CONCATENATED 值与临时表中的值匹配

SQL Server 查找存在于所有不同时期(或序列)中的条目

为数组中的每个元素从表中收集最大整数

SQL Server 分区和 Run Case 语句

条件前置值

Hive SQL如何获取加权样本数据?

从 2 列中获取最高/最低值