代码之家  ›  专栏  ›  技术社区  ›  Nick

使用JDOQL的GAE数据存储和安全风险

  •  0
  • Nick  · 技术社区  · 16 年前

    我刚开始做一个将在谷歌应用引擎(GAE)上运行的项目。我使用Java(WIKET)和一些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 回复  |  直到 16 年前
        1
  •  4
  •   jsight TaherT    16 年前

    是的,这取决于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
  •  1
  •   Nick Johnson    16 年前

    是的,一般来说,它容易受到注入漏洞的影响。不过,在文档中的示例中,它并不适用——类名由应用程序的作者控制,在本例中,姓氏是一个文本字符串。

        3
  •  -1
  •   DataNucleus    16 年前

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

    推荐文章