【问题标题】:GAE Datastore and security risks with JDOQLJDOQL 的 GAE 数据存储和安全风险
【发布时间】:2009-09-01 16:34:25
【问题描述】:

我刚刚开始研究一个将在谷歌应用引擎 (GAE) 上运行的项目。我正在使用带有一些 ajax 的 java (wicket)。

我在关系数据库方面经验丰富,通常使用 iBatis 之类的工具。在使用 JDO 浏览 GAE 数据存储的文档和示例时,我看到他们正在执行以下内容:

String query = "select from " + Employee.class.getName() + " where lastName == 'Smith'";
List<Employee> employees = (List<Employee>) pm.newQuery(query).execute();

有谁知道这个 JDOQL 查询是否会受到 SQL 注入等安全问题的影响?如果是这样,有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: java google-app-engine sql-injection jdoql


    【解决方案1】:

    是的,这会受到 sql 注入的影响(好吧,在这种情况下是 JDOQL 注入)。您应该改用参数,如GAE/J documentation 中的示例。

    Query query = pm.newQuery(Employee.class);
    query.setFilter("lastName == lastNameParam");
    query.setOrdering("hireDate desc");
    query.declareParameters("String lastNameParam");
    
    try {
        List<Employee> results = (List<Employee>) query.execute("Smith");
        if (results.iterator().hasNext()) {
            for (Employee e : results) {
                // ...
            }
        } else {
            // ... no results ...
        }
    } finally {
        query.closeAll();
    }
    

    【讨论】:

      【解决方案2】:

      是的,通常它容易受到注入漏洞的影响。但是,在文档中的示例中,它并不适用 - 类名由应用程序的作者控制,在这种情况下,姓氏是一个文字字符串。

      【讨论】:

        【解决方案3】:

        任何 JDOQL 查询都被转换为等效的底层查询。在 RDBMS 中,它恰好是 SQL。在 GAE/J 中,它是他们的查询 API。这意味着不确定是否存在任何“注入”。您是应用程序开发人员并定义查询,因此您可以完全控制这些事情。

        【讨论】:

          猜你喜欢
          • 2010-10-26
          • 2017-06-06
          • 2021-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多