Предоставляет ли подготовленноеStatement SQL-инъекцию?

Я прочитал и попытался применить уязвимые sql-запросы к моему приложению. Это недостаточно безопасно. Я просто использую Connection Statement для проверки базы данных и других операций вставки.

Являются ли подготовленные состояния безопасными? и, кроме того, будет какая-то проблема с этим утверждением тоже?

Использование конкатенации строк для построения вашего запроса с произвольного ввода не сделает PreparedStatement безопасным. Взгляните на этот пример:

 preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';"; 

Если кто-то ставит

 ' or '1'='1 

как userName , ваш PreparedStatement будет уязвим для SQL-инъекции, поскольку этот запрос будет выполняться в базе данных как

 SELECT * FROM users WHERE name = '' OR '1'='1'; 

Итак, если вы используете

 preparedStatement = "SELECT * FROM users WHERE name = ?"; preparedStatement.setString(1, userName); 

вы будете в безопасности.

Некоторые из этого кода взяты из этой статьи в Википедии .

Подготовленный оператор, если он используется правильно, защищает от SQL-инъекции. Но, пожалуйста, отправьте пример кода на свой вопрос, чтобы мы могли правильно его использовать.

Ну просто использование PreparedStatement не делает вас безопасным. Вы должны использовать параметры в своем SQL запросе, который возможен с помощью PreparedStatement . Посмотрите здесь для получения дополнительной информации.

Как объясняется в этой статье , PreparedStatement не поможет вам, если вы все еще конкатенируете строки.

Например, один из злоумышленников-злоумышленников может сделать следующее:

  • вызовите функцию сна, чтобы все соединения с базой данных были заняты, поэтому ваше приложение недоступно
  • извлечение конфиденциальных данных из БД
  • обход аутентификации пользователя

И это не просто SQL, который может быть затронут. Даже JPQL может быть скомпрометирован, если вы не используете параметры привязки.

В нижней строке вы никогда не должны использовать конкатенацию строк при создании операторов SQL. Для этого используйте специальный API:

  • API-интерфейс JPA
  • jOOQ
Давайте будем гением компьютера.