GAO数据存储和JDOQL的安全风险

时间:2009-09-01 16:34:26

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

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

我对关系数据库很有经验,通常使用像iBatis这样的东西。在使用JDO浏览GAE数据存储区的文档和示例时,我发现它们正在执行以下内容:

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

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

3 个答案:

答案 0 :(得分:4)

是的,这是受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();
}

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

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