GAE Datastore и риски безопасности с JDOQL - PullRequest
0 голосов
/ 01 сентября 2009

Я только начал работать над проектом, который будет работать на движке приложений Google (GAE). Я использую Java (калитку) с некоторыми AJAX.

Я имею опыт работы с реляционными базами данных и обычно использую что-то вроде iBatis. При просмотре документов и примеров для хранилища данных GAE с использованием JDO я вижу, что они выполняют такие вещи, как:

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

Кто-нибудь знает, не вызывает ли этот JDOQL-запрос проблемы с безопасностью, такие как SQL-инъекция? Если так, есть ли способ исправить это?

Ответы [ 3 ]

4 голосов
/ 01 сентября 2009

Да, это зависит от 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();
}
1 голос
/ 01 сентября 2009

Да, в общем, оно уязвимо для уязвимостей инъекций. Однако в примерах, приведенных в документации, это не применимо - имя класса контролируется автором приложения, а фамилия в данном случае является литеральной строкой.

0 голосов
/ 01 сентября 2009

Любой запрос JDOQL переводится в эквивалентный базовый запрос. В СУБД это просто SQL. В GAE / J это их API запросов. Это значит, что не существует какой-либо «инъекции» чего-либо. Вы разработчик приложения и определяете запросы, следовательно, у вас есть полный контроль над такими вещами.

...