V5309. OWASP. Possible SQL injection. Potentially tainted data is used to create SQL command.
Анализатор обнаружил создание SQL-команды из данных, полученных из внешнего источника, без предварительной проверки. Это может стать причиной возникновения SQL-инъекции в случае, если данные будут скомпрометированы.
SQL-инъекции выделены в отдельную категорию рисков в OWASP Top 10 Application Security Risks 2017: A1:2017-Injection.
Рассмотрим пример:
public static void getFoo(Connection conn, String bar) throws SQLException {
var st = conn.createStatement();
var rs = st.executeQuery("SELECT * FROM foo WHERE bar = '" + bar + "'");
// ....
}
В данном случае при создании SQL-команды используется значение переменной 'bar', полученной из публичного метода. Так как метод публичный, туда могут попасть непроверенные данные из внешнего источника (контроллеров, форм и пр.). Использование данных без какой-либо проверки является опасным, так как открывает злоумышленникам разные способы внедрения команд.
Например, вместо ожидаемого значения имени пользователя злоумышленник может ввести специальную команду. Тогда из базы произойдёт извлечение данных всех пользователей, для которых будет запущена дальнейшая обработка.
Пример такой скомпрометированной строки для запроса выше:
' OR '1'='1
Для защиты от подобных запросов следует использовать параметризированные команды:
public static void getFoo(Connection conn, String bar) throws SQLException {
var sql = "SELECT * FROM foo WHERE bar = ?";
var st = conn.prepareStatement(sql);
st.setString(1, bar);
var rs = st.executeQuery();
// ....
}
Также безопасной альтернативой будет использование ORM, если нет необходимости в прямом исполнении SQL-запросов.