![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Alagert |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 25.8.2005 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Доброго времени суток!
Народ помогите советом! Есть прослойка между приложением и MSSQL Server. Она умеет генерить запросы из инфы, пришедшей от приложения и выполнять их на сервере. Сейчас это сделано след образом: из запроса от приложения собираются искомые поля и ограничения. На их основе формируется sql запрос в виде строки.(String) Затем Создается Statement и выполняется. Все работает отлично. Но, наш заказчик тут выдал следущую мысль:
и вот такой пример:
Чем поверг нас в большие непонятки. Так вот, собственно сам вопрос: чем PreparedStatement лучше с точки зрения какой либо безопасности? Или может мы упустили какой то другой момент? Заранее спасибо! --------------------
[color=blue]BORN TO BE ROOT#[/color] |
||||
|
|||||
| Devorior |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 559 Регистрация: 1.8.2002 Где: Обнинск Репутация: 1 Всего: 3 |
На мой взгляд, проверки на подставляемые в коде значения надо проводить по мере получения параметров извне (прослойка, браузер или другое приложение). А разница между Statement и PrepareStatement в плане безопасности отстуствует и не надо об этом зацикливаться. Тщательно проверяйте все что идет на входе до выполнения каких-либо операций.
|
|||
|
||||
| Stampede |
|
||||||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
Весьма смелое, но, увы, ошибочное заявление. Чтобы понять, о чем говорит заказчик, надо представлять себе технику SQL injection аттак. Если на пальцах, то примерно следующим образом. Допустим, на странице вебсайта есть поле для логина/пароля. Что делает злоумыленник? Очень тривиальную вещь! Он исходит из предположения, что параметры входа так или иначе будут использованы серверным скриптом в виде следующей конструкции:
Понятно, что названия столбцов плохишу будут скорее всего неизвестны, но ему это и не нужно. Он просто возьмет и ведет такие значения: логин: admin пароль: asdf' or 1 = 1 Нетрудно видеть, что если скрипт не предусматривает защиту от SQL injection, то по исполнении сгенерированного запроса злоумышленнику с радостью предоставят все админские полномочия:
Так вот, в случае использования PreparedStatement такая подстановка в принципе невозможна, что, собственно, и имел в виду заказчик. Это сообщение отредактировал(а) Stampede - 22.8.2006, 18:39 -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
||||||
|
|||||||
| Devorior |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 559 Регистрация: 1.8.2002 Где: Обнинск Репутация: 1 Всего: 3 |
все верно, надо вырезать "левое" из логина и пароля, а потом подставлять в SQL, неважно как реализуемый
|
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Уххх.... точно... вот это ребусик
В репу. -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
Определить, что именно левое, а что правое - в общем случае задача достаточно нетривиальная. К тому же учти, что речь может идти не только о логине, но и о вполне безобидных на первый взгляд запросах, таких как получение списка сообщений, удовлетворяющих некоторому условию. Поэтому еще раз: если запросы фиксированного формата, то использование PreparedStatement было бы самым простой и естественной формой защиты. Если, как у вас, запросы строятся "на лету", то тут трудно предложить что-либо конкретное, не владея подробной инфой о структуре проложения и характере запросов. Например, что из себя представляет типичный запрос? Сколько и каких параметров он принимает? Сколько таблиц могут фигурировать в запросе? Откуда берутся метаданные? Ну и так далее. |
|||
|
||||
| Alagert |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 25.8.2005 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Stampede, Огромнейшее спасибо! Есть над чем поразмыслить. Завтра с работы подкину новую партию мыслей для обсуждения.
--------------------
[color=blue]BORN TO BE ROOT#[/color] |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 4 Всего: 57 |
Stampede, вообще верно, но допустим если у меня еще будет проверка на вводимые числа? Если я в промежутке(допустим вместо пароля пин карточки, что есть цифры) я еще буду проверять чтобы все символы были цифрами, то как минимум наличие пробела и "=" уже не даст дойти до запроса.
А написать такую бональную проверку, две минуты. -------------------- менеджер по кодеврайтингу |
|||
|
||||
| serious |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 15.2.2003 Где: Пенза Репутация: 1 Всего: 1 |
А насколько безопасен такой код:
если логин осуществляется только по e-mail. -------------------- Я знаю то, что ничего не знаю, а некоторые не знают и этого. |
|||
|
||||
| Alagert |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 25.8.2005 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Всем спасибо за советы. Ща сидел проверял на подобные штуки наш код.
Вроде бы мы не наткнулись на эти грабли. Тк все поля обрабатываются и засовываются в ковычки, то пример, приведенный Stampede, не работает. Ща еще капаю в эту сторону. Но пока склоняюсь к тому, что не буду ни чего переделовать --------------------
[color=blue]BORN TO BE ROOT#[/color] |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Интерестно как это у вас происходит, учитываюя что код 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. |
|||
|
||||
| serious |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 15.2.2003 Где: Пенза Репутация: 1 Всего: 1 |
-------------------- Я знаю то, что ничего не знаю, а некоторые не знают и этого. |
|||
|
||||
| Alagert |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 25.8.2005 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
К примеру, у нас полдучается вот такой код:
Соответсвенно, OR внутри строкового параметра. Поэтому все норм. Я пока не могу говорить, что наш код полностью от этого защищен(Я скорей уверен в том, что это не так Пока ищу еще возможности для атаки. --------------------
[color=blue]BORN TO BE ROOT#[/color] |
||||
|
|||||
| LSD |
|
||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Ты невнимательно прочитал пост Stampede, там именно такой случай и рассматривается. Пусть мы генерируем запрос таким макаром:
Если в качестве param передать строку:
То получим запрос:
-------------------- 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. |
||||||
|
|||||||
| Alagert |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 25.8.2005 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Большое спасибо за кропотливость! --------------------
[color=blue]BORN TO BE ROOT#[/color] |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |