0

我刚刚开始研究一个将在 google app engine (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 注入等安全问题的影响?如果是这样,有什么办法可以解决这个问题吗?

4

3 回答 3

4

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

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();
}
于 2009-09-01T17:21:26.240 回答
1

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

于 2009-09-01T19:49:18.627 回答
-1

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

于 2009-09-01T18:28:19.257 回答