Предоставляет ли подготовленноеStatement SQL-инъекцию?
Я прочитал и попытался применить уязвимые sql-запросы к моему приложению. Это недостаточно безопасно. Я просто использую Connection Statement для проверки базы данных и других операций вставки.
Безопасны ли подготовленные состояния? и, кроме того, будет ли проблема с этим утверждением тоже?
Ответы
Ответ 1
Использование конкатенации строк для построения вашего запроса с произвольного ввода не сделает 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);
вы будете в безопасности.
Некоторые из этого кода взяты из этой статьи в Википедии.
Ответ 2
Подготовленный оператор, если он используется правильно, защищает от SQL-инъекции. Но, пожалуйста, отправьте пример кода на свой вопрос, чтобы мы могли правильно его использовать.
Ответ 3
Ну, просто используя PreparedStatement
не делает вас безопасным. Вы должны использовать параметры в своем запросе SQL
, который возможен с помощью PreparedStatement
. Посмотрите здесь для получения дополнительной информации.
Ответ 4
Как объяснено в этот пост, только PreparedStatement
не поможет вам, если вы все еще конкатенируете строки.
Например, один из злоумышленников-злоумышленников может сделать следующее:
- вызовите функцию ожидания, чтобы все соединения с базой данных были заняты, поэтому ваше приложение недоступно
- извлечение конфиденциальных данных из базы данных
- минуя аутентификацию пользователя
И это не просто SQL, на который может повлиять b. Даже JPQL может быть скомпрометирован, если вы не используете параметры привязки.
В нижней строке вы никогда не должны использовать конкатенацию строк при построении операторов SQL. Для этого используйте специальный API: