Безопасен ли JDBC?

Я новичок в JDBC, и новый проект требует от меня использовать JDBC. То, что я хочу знать,

JDBC безопасен?

Как предотвратить проблему, похожую на «Mysql Injection»?

На какие вопросы безопасности я должен обратить внимание при использовании JDBC?

И как обеспечить, я имею в виду, оптимизацию безопасности, чтобы не дать хакерам взломать базу данных?

РЕДАКТИРОВАТЬ:

Я попробовал Google, если я Google:

"проблемы безопасности php mysql" => это дает много результатов

если я гуглю

"проблемы безопасности jdbc mysql" => практически не видны связанные страницы

Означает ли это, что использование jdbc безопасно? Не нужно беспокоиться о том, чтобы быть взломанным?

 Yishai18 авг. 2009 г., 06:21
Я думаю, что когда кто-либо задает вопрос «безопасен ли он», существует высокая вероятность того, что в его коде есть уязвимость, поскольку безопасность - это больше процесс, чем факт. Код / инструменты / сайты не защищены. Они запускаются и используются безопасным образом (или нет) и могут иметь известные уязвимости. Когда люди спрашивают, безопасен ли Х, они склонны думать, что если ответ «да», им больше не нужно думать о безопасности. И это мышление ведет к уязвимости.

Ответы на вопрос(6)

соответствующие определенным правилам регулярных выражений, прежде чем передавать что-либо в БД accessi api.

Он достаточно безопасен, поскольку протокол входа в систему не уязвим для перехвата сети, и очень и очень трудно что-либо внедрить в сетевой трафик.

Однако JDBC просто переносит ваш SQL в базу данных и возвращает полученный набор данных. Если ваша программа уязвима для SQL-инъекций, она будет уязвима, используете ли вы прямое соединение, odbc или jdbc.

Единственный способ действительно защитить себя от SQL-инъекций - использовать подготовленные операторы с "?" введите заполнители для ввода пользователя. Никогда не соединяйте вместе операторы SQL, используя небезопасный ввод (это включает как прямой ввод пользователя, так и данные из таблицы, введенной пользователем).

Безопасность JDBC является свойством используемого вами драйвера JDBC. В целом, если ваш драйвер использует транспортный уровень SSL, он так же безопасен, как и надежность ваших ключей SSL. Если он использует незашифрованный транспорт, он не является безопасным.

Как предотвратить проблему, похожую на «Mysql Injection»?

При составлении запроса SQL для JDBC будьте осторожны, чтобы не включать «сырые» строки, которые могут содержать встроенный SQL. Например:

String query = "SELECT * FROM SOME_TABLE WHERE X = '" + someString + "' ;";

Если someString содержит неэкранированный символ «», то, что вы намереваетесь использовать в качестве литеральной строки SQL, на самом деле может быть заменено чем-то совершенно другим. Исправление состоит в том, чтобы либо отклонитьsomeString если он содержит символы «» (или другие неприятности), или предварительно обработать его методом, который вставляет экранирование строки SQL.

Другой (более простой / более надежный) подход заключается в использовании подготовленных операторов с «?» заполнители и введите значения в запрос, используяsetString(...) и т.п.

На какие вопросы безопасности я должен обратить внимание при использовании JDBC?

Помимо вышесказанного, я не знаю ничего специфического для JDBC. Действительно, ни один из вышеперечисленных вопросов не является специфическим для JDBC.

И как обеспечить, я имею в виду, оптимизацию безопасности, чтобы не дать хакерам взломать базу данных?

Купите / прочитайте хорошую книгу по созданию безопасных систем.Быть осторожен.Оплатите эксперта по безопасности для проверки вашего кода / системы.
Решение Вопроса

использованиеподготовленные заявления, Для гипотетического входа в систему вы можете использовать это, например:

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM member WHERE member_username = ? AND member_password = ?");
stmt.setString(1, username);
stmt.setString(2, password);
stmt.execute();

ResultSet rs = stmt.getResultSet();
// ...

Это полностью защитит вас от уязвимостей SQL-инъекций.

 ZeroCool18 авг. 2009 г., 07:05
А что такое небезопасная версия?
 Jesse Weigert18 авг. 2009 г., 07:01
Это работает для PHP / MySQL, а также практически для любого другого современного / веб-языка программирования.
 Tom Hawtin - tackline21 авг. 2009 г., 02:27
Технически спецификация JDBC не требует, чтобы драйвер правильно экранировал аргумент. Я не знаю, какие драйверы делают это правильно, а какие нет.
 Erich Kitzmueller10 нояб. 2009 г., 09:38
ZeroCool: небезопасная версия - это что-то вроде conn.createStatement (). Execute ("SELECT * from mytable where username = '" + username + "'"));
 kanayaki18 авг. 2009 г., 05:20
Спасибо, это то, что у меня есть в моем текущем коде. Я имею в виду подготовленные заявления. Сейчас я с облегчением :)

org.apache.commons.lang.StringEscapeUtils.escapeSql (java.lang.String str)"чтобы предотвратить sql-инъекцию.

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

 Ian Oxley13 июл. 2012 г., 10:13
FWIW, StringEscapeUtils больше не содержит метод escapeSql:commons.apache.org/lang/api-3.1/org/apache/commons/lang3/...

он так же безопасен, как и все другие способы соединения с базой данных.

Большинство проблем безопасности не имеют никакого отношения к самому протоколу JDBC. Например, вы можете минимизировать риск SQL-инъекций, используя Prepared Statement. Это будет верно независимо от того, как вы подключаетесь к базе данных.

 kanayaki18 авг. 2009 г., 05:21
Отличное объяснение. Теперь я понимаю, спасибо.

Ваш ответ на вопрос