Spring (MVC) Во избежание внедрения SQL? - PullRequest
9 голосов
/ 12 декабря 2011

Мне интересно, как Spring MVC обрабатывает SQL-инъекции (и другие проблемы безопасности: XSS, внедрение кода [javascript] и т. Д.). Я говорю в основном об экранировании значений, которые добавляются в БД и тому подобное. Кажется, я не могу найти никакого ответа, потому что каждый раз, когда я ищу результаты весеннего внедрения SQL, которые включают внедрение зависимости.

Мой поток выглядит следующим образом: из браузера клиента я делаю запрос, состоящий из JSON с некоторыми параметрами запроса (не оператор SQL, который был бы слишком глупым - чтобы сформировать запрос SQL в JS). Когда запрос достигает должным образом аннотированного метода в контроллере, запрос отображается через @RequestBody с использованием Jackson на «объект запроса». Теперь этот объект отправляется в DAO, где с помощью шаблона JDBC я запрашиваю базу данных (и с помощью RowMapper я отображаю результаты).

В DAO у меня есть что-то вроде:

public int countAll(RequestObject request) {
    String sql = "SELECT count(*) FROM employees WHERE name = '" + request.getName() + "'";

    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    int count = jdbcTemplate.queryForInt(sql);

    return count;
}

Теперь этот подход безопасен от внедрения SQL? Безопасны ли запросы, не основанные на JDBCTemplate, если они проходят через Spring MVC?

Не могли бы мы немного поговорить об этом?

1 Ответ

16 голосов
/ 12 декабря 2011

Каждый раз, когда вы создаете запрос путем конкатенации, вы уязвимы для атак с использованием инъекций.

передает ваши параметры правильно:

jdbcTemplate.queryForInt(sql, args, argTypes)

, например:

        JdbcTemplate insert = new JdbcTemplate(dataSource);
    insert.update("INSERT INTO PERSON (FIRSTNAME, LASTNAME) VALUES(?,?)",
            new Object[] { firstName, lastName });
...