我刚刚开始研究将在谷歌应用引擎(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注入等安全问题的影响?如果是这样,有什么方法可以解决这个问题吗?
答案 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。这意味着没有任何“注入”任何东西是不明确的。您是应用程序开发人员并且您定义了查询,因此您可以完全控制这些事情。