Вы должны оспорить это требование.
Внедрение SQL происходит, когда у вас нет гарантии, что значение параметра не будет защищено / проверено на предмет его структуры, которая может содержать не только значение «нормальное / ожидаемое» для параметра.
Например, вместо простого foo
текстового значения для searchFor
оно может содержать дополнительную логику в запросе foo OR ''=''
.
Здесь это не должно быть возможно.
searchFor
, указанное как @Param
, не будет разрешено использовать при атаках SQL-инъекций. Spring будет привязывать значение параметра безопасным способом, как это делают реализации JPA, то есть устанавливает параметр из экземпляра запроса JPA, который защищен от SQL-инъекций для объявленных параметров.
Например, возьмем этот запрос (для упрощения я удалил часть %
):
"SELECT u FROM User u WHERE lower(u.username) LIKE :searchFor"
И попробуйте установить параметр searchFor
с помощью строки "foo OR ''==''"
, чтобы попытаться ввести условие SQL, которое всегда выполняется.
Если вы включите журнал реализации JPA для вывода привязки параметров (для Hibernate: logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
), вы можете увидеть что-то вроде:
TRACE 11012 --- [nio-8080-exec-8] o.h.type.descriptor.sql.BasicBinder
: параметр привязки [1] как [VARCHAR] - [foo OR '' == '']
Привязка только выполняется для значения параметра, а не для добавления новой логики запроса. Последняя защищенная часть запроса защищена так:
SELECT u FROM User u WHERE lower(u.username) LIKE "foo OR ''==''"