Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разница между Statement и PreparedStatement, с точки зрения безопасности 
:(
    Опции темы
Alagert
Дата 22.8.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Доброго времени суток!

Народ помогите советом!
Есть прослойка между приложением и MSSQL Server. Она умеет генерить запросы из инфы, пришедшей от приложения и выполнять их на сервере. Сейчас это сделано след образом: из запроса от приложения собираются искомые поля и ограничения. На их основе формируется sql запрос в виде строки.(String) Затем Создается Statement и выполняется. Все работает отлично.

Но, наш заказчик тут выдал следущую мысль:
Цитата
remember use preventing techique for sql injection.

и вот такой пример:
Код

PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM BOOKLIST WHERE ISBN = ?");

...

ParameterMetaData pmd = pstmt.getParameterMetaData();

int colType = pmd.getParameterType(1);



Чем поверг нас в большие непонятки.
Так вот, собственно сам вопрос: чем PreparedStatement лучше с точки зрения какой либо безопасности? 
Или может мы упустили какой то другой момент?

Заранее спасибо!
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
Devorior
Дата 22.8.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 1.8.2002
Где: Обнинск

Репутация: 1
Всего: 3



На мой взгляд, проверки на подставляемые в коде значения надо проводить по мере получения параметров извне (прослойка, браузер или другое приложение). А разница между Statement и PrepareStatement в плане безопасности отстуствует и не надо об этом зацикливаться. Тщательно проверяйте все что идет на входе до выполнения каких-либо операций.
PM MAIL ICQ   Вверх
Stampede
Дата 22.8.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(Devorior @  22.8.2006,  08:49 Найти цитируемый пост)
А разница между Statement и PrepareStatement в плане безопасности отстуствует и не надо об этом зацикливаться


Весьма смелое, но, увы, ошибочное заявление. Чтобы понять, о чем говорит заказчик, надо представлять себе технику SQL injection аттак. Если на пальцах, то примерно следующим образом.

Допустим, на странице вебсайта есть поле для логина/пароля. Что делает злоумыленник? Очень тривиальную вещь! Он исходит из предположения, что параметры входа так или иначе будут использованы серверным скриптом в виде следующей конструкции:

Код

select ...
  where login_name = '<введенное имя>' and password = '<введенный пароль>'


Понятно, что названия столбцов плохишу будут скорее всего неизвестны, но ему это и не нужно. Он просто возьмет и ведет такие значения:

логин: admin
пароль: asdf' or 1 = 1

Нетрудно видеть, что если скрипт не предусматривает защиту от SQL injection, то по исполнении сгенерированного запроса злоумышленнику с радостью предоставят все админские полномочия:

Код

select ...
  where login_name = 'admin' and password = 'asdf' or 1 = 1


Так вот, в случае использования PreparedStatement такая подстановка в принципе невозможна, что, собственно, и имел в виду заказчик.


Это сообщение отредактировал(а) Stampede - 22.8.2006, 18:39


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Devorior
Дата 22.8.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 1.8.2002
Где: Обнинск

Репутация: 1
Всего: 3



все верно, надо вырезать "левое" из логина и пароля, а потом подставлять в SQL, неважно как реализуемый
PM MAIL ICQ   Вверх
chief39
Дата 22.8.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Уххх.... точно... вот это ребусик smile
В репу.


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Stampede
Дата 22.8.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(Devorior @  22.8.2006,  09:34 Найти цитируемый пост)
надо вырезать "левое" из логина и пароля, а потом подставлять в SQL


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

Поэтому еще раз: если запросы фиксированного формата, то использование PreparedStatement было бы самым простой и естественной формой защиты. Если, как у вас, запросы строятся "на лету", то тут трудно предложить что-либо конкретное, не владея подробной инфой о структуре проложения и характере запросов.

Например, что из себя представляет типичный запрос? Сколько и каких параметров он принимает? Сколько таблиц могут фигурировать в запросе? Откуда берутся метаданные?

Ну и так далее.

PM WWW   Вверх
Alagert
Дата 22.8.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Stampede, Огромнейшее спасибо! Есть над чем поразмыслить. Завтра с работы подкину новую партию мыслей для обсуждения.
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
Bulat
Дата 23.8.2006, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 4
Всего: 57



Stampede, вообще верно, но допустим если у меня еще будет проверка на вводимые числа? Если я в промежутке(допустим вместо пароля пин карточки, что есть цифры) я еще буду проверять чтобы все символы были цифрами, то как минимум наличие пробела и "=" уже не даст дойти до запроса.
А написать такую бональную проверку, две минуты.  smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
serious
Дата 23.8.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: 1
Всего: 1



А насколько безопасен такой код:
Код

Session session = getSession();
Query query = session.createQuery("from User where email = :email");
query.setString("email", email);
User user = (User) query.uniqueResult();

если логин осуществляется только по e-mail.


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Alagert
Дата 23.8.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Всем спасибо за советы. Ща сидел проверял на подобные штуки наш код. 
Вроде бы мы не наткнулись на эти грабли. Тк все поля обрабатываются и засовываются в ковычки, то пример, приведенный Stampede, не работает. Ща еще капаю в эту сторону. Но пока склоняюсь к тому, что не буду ни чего переделовать smile
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
LSD
Дата 23.8.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Alagert @  23.8.2006,  11:51 Найти цитируемый пост)
Тк все поля обрабатываются и засовываются в ковычки, то пример, приведенный Stampede, не работает.

Интерестно как это у вас происходит, учитываюя что код Stampede работает с кавычками?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
serious
Дата 23.8.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: 1
Всего: 1





--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
Alagert
Дата 23.8.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Цитата(LSD @  23.8.2006,  10:58 Найти цитируемый пост)
Интерестно как это у вас происходит, учитываюя что код Stampede работает с кавычками?

К примеру, у нас полдучается вот такой код:
Код

SELECT * FROM ecjournal WHERE  (CompanyId='egdf or 1=1')

Соответсвенно, OR внутри строкового параметра. Поэтому все норм. 
Я пока не могу говорить, что наш код полностью от этого защищен(Я скорей  уверен в том, что это не так smile)

Пока ищу еще возможности для атаки.
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
LSD
Дата 23.8.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Alagert @  23.8.2006,  12:46 Найти цитируемый пост)
Соответсвенно, OR внутри строкового параметра. Поэтому все норм.

Ты невнимательно прочитал пост Stampede, там именно такой случай и рассматривается.
Пусть мы генерируем запрос таким макаром:
Код
String query = "SELECT * FROM ecjournal WHERE  (CompanyId='" + param + "')";

Если в качестве param передать строку:
Код
String param = "1' or '1' = '1";

То получим запрос:
Код
SELECT * FROM ecjournal WHERE  (CompanyId='1' or '1' = '1')



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Alagert
Дата 23.8.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 1



smile Ты идешь моим же путем! Я проверял этот вариант. Но он тоже не проходит, тк наша прога при получении ограничений, просматривает их. Если находит внутри ковычки, то она экранирует их ковычкой. Те этот пример у нас будет выглядеть так:
Код

SELECT * FROM ecjournal WHERE  (CompanyId='1'' or ''1''=''1')


Большое спасибо за кропотливость! 
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.