как предотвратить SQL-инъекцию в JSP? - PullRequest
9 голосов
/ 08 июня 2011

Только на прошлой неделе я занимался PHP.Я разработал небольшое решение для предотвращения SQL-инъекций.PHP всегда был моим человеком, у него легко есть 3 решения для использования (возможно, больше).Одним из них является включение «магических запросов» с использованием функции stripslashes().Другой (рекомендуемый) - использовать функцию mysql_real_escape_string().Это просто и моя проблема решена.Однако, когда дело доходит до JSP, все не так просто.Я искал и не нашел никакой встроенной функции для удаления слешей или выполнения подобных действий (я считаю, что такие функции могут быть реализованы с использованием базовых функций JAVA, но ...).

Пожалуйста, помогите мне защитить моибаза данных.Я слышал о PreparedStatement, но неужели я не могу понять это?(Я чувствую реальный смысл новизны).

1 Ответ

23 голосов
/ 08 июня 2011

Просто используйте PreparedStatement вместо Statement.

То есть используйте

String sql = "INSERT INTO tbl (col1, col2, col3) VALUES (?, ?, ?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, col1);
preparedStatement.setString(2, col2);
preparedStatement.setString(3, col3);
preparedStatement.executeUpdate();

вместо

String sql = "INSERT INTO tbl (col1, col2, col3) VALUES ('" + col1 + "', '" + col2 + "', '" + col3 + "')";
statement = connection.createStatement();
statement.executeUpdate(sql);

PreparedStatement также предлагает удобные методы установки для других типов, таких как setInt(), setDate(), setBinaryStream() и так далее.

Обратите внимание, что эта проблема не связана с JSP.Это связано с Java в целом.Написание сырого кода Java в классе JSP также считается плохой практикой .Рекомендуется создать отдельный класс, который выполняет все задачи взаимодействия с БД в конкретной таблице, которая также называется классом DAO (Data Access Object).Затем вы можете импортировать / использовать этот класс DAO в классе сервлета.

См. Также:

...