【问题标题】:spring for mongodb escaping parameters to avoid SQL injectionspring 用于 mongodb 转义参数以避免 SQL 注入
【发布时间】:2015-01-16 22:53:55
【问题描述】:

我是一个新手,在 MongoDB 中使用 spring。

我正在使用使用 MongoOperations 对象的 Dao 模式。

由于我在 RDBMS 和 JPA 方面拥有丰富的经验,因此我们通常使用 setParameter,它还负责转义和避免 SQL 注入。

我想知道 MongoDB 在春天是否有这样的想法。我找不到它,但我可能会遗漏一些东西。我不得不说我仍然不确定使用 Mongo 是否存在 SQL 注入风险。

另外,有没有办法在 MongoDB 中创建命名查询?

谢谢大家。

【问题讨论】:

    标签: spring sql-injection spring-data-mongodb nosql


    【解决方案1】:

    有一种非常类似于 SQL 注入的东西,即 NOSQL 注入
    特殊字符不同但概念相同:用户可以控制/修改/破坏请求。

    然而,这些数据库仍然可能容易受到注入攻击,即使它们没有使用传统的 SQL 语法。由于这些 NoSQL 注入攻击可能在过程语言中执行,而不是在声明式 SQL 语言中执行,因此潜在影响比传统 SQL 注入更大

    有一种方法可以验证,here is an OWASP page 可以帮助您进行测试。

    基本是验证您的请求是否正确转义' " \ ; { } 甚至更多。

    似乎 spring data mongodb 正确地逃脱了这些,但我不知道它是否完全安全。

    至于命名查询,我认为this answer 是正确的并且它们不存在,但如果你有一个存储库,你仍然有一个@Query 注释。

    并且因为您使用自定义存储库并不意味着您也不能使用存储库接口,Spring data 允许您在不实现 repostiroy 的情况下实现它,see here

    【讨论】:

      【解决方案2】:

      Mongo 中没有 SQL 注入这种东西,因为 Mongo 根本不使用 SQL 语言。

      Spring Data MongoDB 中没有命名查询的概念,而是使用 @Query 注释存储库方法:

      public interface PersonRepository extends MongoRepository<Person, String>
      
        @Query(value="{ 'firstname' : ?0 }", fields="{ 'firstname' : 1, 'lastname' : 1}")
        List<Person> findByThePersonsFirstname(String firstname);
      }
      

      【讨论】:

      • 您好,感谢您的快速答复。我没有使用 MongoRepository 我只是使用我自己的 DAO 接口和我使用 MongoOperations 执行的一组方法。我确实读到过 mongo 中存在一些类似风险的注入(请参阅docs.mongodb.org/manual/faq/developers/…),但我认为在使用 Criteria.where(PROPERTY).is(VALUE) 时会处理它们 - 我认为 is 方法会处理它。但我仍然找不到自己的方法。
      • 没有SQL注入的概念,但有类似的概念。如果你有一个字符串“我的字符串”,如果你不转义它,这个字符会破坏你的查询。所以说没有类似的概念是不正确的
      猜你喜欢
      • 2022-01-17
      • 2014-06-16
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多