2009-08-18 5 views
2

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

является защитой JDBC?

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

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

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

EDIT:

Я попытался Google, если я Google:

"Проблемы безопасности PHP MySQL" => он дает много результата

если я Google:

«JDBC mysql security problems "=> трудно увидеть связанные страницы

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

+3

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

ответ

11

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

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-инъекции.

+1

Спасибо, это то, что у меня есть в моем текущем коде. Я имею в виду подготовленные заявления. Я сейчас помогаю :) – 2009-08-18 03:20:05

+0

Это работает для PHP/MySQL, а также практически любого другого современного языка веб-программирования. –

+0

А что такое незащищенная версия? – ZeroCool

5

JDBC - это протокол подключения к базе данных, он столь же безопасен, как и все другие средства для подключения к базе данных.

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

+0

Отличное объяснение. Теперь я понимаю, спасибо. – 2009-08-18 03:21:26

2

JDBC - это исключительно транспорт между вашей программой и базой данных.

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

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

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

10

является защитой JDBC?

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

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

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

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

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

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

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

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

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

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

Или вы можете использовать полезный метод: «org.apache.commons.lang.StringEscapeUtils.escapeSql(java.lang.String str)», чтобы предотвратить возникновение SQL-инъекции.

String санитария всегда будет лучшей политикой для предотвращения вторжений sql-инъекций или межсайтового скриптинга.

+2

FWIW, StringEscapeUtils больше не содержит метод escapeSql: http://commons.apache.org/lang/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html –

0

Всегда используйте полевые валидаторы, соответствующие некоторым правилам регулярных выражений, прежде чем передавать что-либо в DB acceess api.

Смежные вопросы