Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с компонентов ADOQuery

489
06 ноября 2007 года
NeO_u
277 / / 11.10.2006
У меня появился такой вопрос: как в компоненте ADOQuery1..Написать корректный sql запрос, т.е. напишу формально, но точно знаю, что такое есть в java:
 
Код:
ADOQuery1->SQL->Text = "Select * from table where param1=@par":
ADOQuery1->SQL->Params[0] = "test'test\bv";
ADOQuery1->SQL->PrepareStatement();

Суть этого процесса вот в чем: допустим, если встречаются знаки sql, такие как ',\," итп он подставляет \ перед ними...
Можно конечно сесть и написать свою функцию, которая будет это делать, но зачем изобретать велосипед, если он уже изобретен:-)
Есть ли такая возможность или нет?
4.7K
07 ноября 2007 года
moroz1
79 / / 16.02.2007
Вот пример как работать с параметрами запроса.
А в С++ объявишь параметр ntabl как String и все.
 
Код:
ADOQuery1->Close();
 ADOQuery1->SQL->Clear();
 ADOQuery1->SQL->Text ="SELECT * FROM "+ntabl+" WHERE ...."
 ADOQuery1->Open();

Или что-то не то?
489
08 ноября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: moroz1
Вот пример как работать с параметрами запроса.
А в С++ объявишь параметр ntabl как String и все.
 
Код:
ADOQuery1->Close();
 ADOQuery1->SQL->Clear();
 ADOQuery1->SQL->Text ="SELECT * FROM "+ntabl+" WHERE ...."
 ADOQuery1->Open();

Или что-то не то?



не то однозначно:-)
я уже вроде как нашел решение, сча его

Выкладываю правильный запрос к БД, с точки зрения безопасности:

 
Код:
ADOQuery1->Parameters->Clear(); // очищаем параметры
ADOQuery1->SQL->Text = "SELECT * from table where table.param1 = :param1 or table.param2 = :param2"; // создаем параметризированный запрос к БД
ADOQuery1->Parameters->ParamValues["param1"] = "'/\/'"; //значение 1го параметра
ADOQuery1->Parameters->ParamValues["param2"] = "'' asg''''"; //значение 2го параметра


Преимущество такого построения запроса является неуязвимость кода к разным кавычкам, слешам итп.

ЗЫ: Модераторы: добавьте это в ФАК. Очень облегчает жизнь против разных видов sql иньекций:-)
1
08 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: NeO_u
не то однозначно:-)
я уже вроде как нашел решение, сча его

Выкладываю правильный запрос к БД, с точки зрения безопасности:
 
Код:
ADOQuery1->Parameters->Clear(); // очищаем параметры
ADOQuery1->SQL->Text = "SELECT * from table where table.param1 = :param1 or table.param2 = :param2"; // создаем параметризированный запрос к БД
ADOQuery1->Parameters->ParamValues["param1"] = "'/\/'"; //значение 1го параметра
ADOQuery1->Parameters->ParamValues["param2"] = "'' asg''''"; //значение 2го параметра


Преимущество такого построения запроса является неуязвимость кода к разным кавычкам, слешам итп.

ЗЫ: Модераторы: добавьте это в ФАК. Очень облегчает жизнь против разных видов sql иньекций:-)


мммм. сильно сказано. Но ИМХО относительную неуязвимость кода может обеспечить - первое - проверка размера передаваемых данных в программу. Второе - очистка данных от "опасных" символов.
Идея автора не очень понятна. Т.е. параметры вроде как должны быть получены от пользователя? тогда какое преимущество мы получаем? если параметры забиты в код - то тогда вобще смысл? Или может я чтото упустил?

1
08 ноября 2007 года
kot_
7.3K / / 20.01.2000
Или автор имел ввиду что он наконец добрался до разделов справки о том как использовать параметры в компонентах для работы с БД? Тогда поздравляем :)
489
08 ноября 2007 года
NeO_u
277 / / 11.10.2006
Хорошо перефразирую:
Попробуйте запрос сделать таким образом:
 
Код:
ADOQuery1->SQL->Text = "select * from table1 where param1='"Edit1->Text+"'";

А потом попробуйте моим параметром, и произведите простую sql иньекцию...и тогда вы поймете, в чем подвох. в этой случае sql иньекция пройдет, а в том случае, что я предлогаю, все ' заменяться на \', " заменяться на \" и \ на \\. Это основное условия от sql иньекций (самый простой способ взлома).
3.2K
08 ноября 2007 года
nikipelovav
152 / / 12.04.2006
Надеюсь Я понял о чём писал автор темы.

Вот ответ: строковые параметры надо заключать в двойные ковычки используя метод

AnsiQuotedStr ( str, '"' );
1
08 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: NeO_u
Хорошо перефразирую:
Попробуйте запрос сделать таким образом:
 
Код:
ADOQuery1->SQL->Text = "select * from table1 where param1='"Edit1->Text+"'";

А потом попробуйте моим параметром, и произведите простую sql иньекцию...и тогда вы поймете, в чем подвох. в этой случае sql иньекция пройдет, а в том случае, что я предлогаю, все ' заменяться на \', " заменяться на \" и \ на \\. Это основное условия от sql иньекций (самый простой способ взлома).



здесь
здесь
и здесь
ничего не напоминает? :)

1
08 ноября 2007 года
kot_
7.3K / / 20.01.2000
Интересно - куда надо записать и сколько раз повторить - что параметры надо использовать?
489
08 ноября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: kot_
здесь
здесь
и здесь
ничего не напоминает? :)



Из всего напоминает только первое:-)
Но ошибку понял, признаю. Тему можно закрыть:-)

1
08 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: NeO_u
Из всего напоминает только первое:-)
Но ошибку понял, признаю. Тему можно закрыть:-)


Кстати надо учитывать - что параметры тоже не панацея - конкретный пример привести не могу - лень. но думаю что существует возможность создать уязвимость даже на первый взляд в защищенном коде. поэтому любое получение данных о пользователя должно:
1. Проверяться на размер введенных данных
2. На наличие недопустимых символов
3. Наличие паттернов командной строки

489
08 ноября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: kot_
Кстати надо учитывать - что параметры тоже не панацея - конкретный пример привести не могу - лень. но думаю что существует возможность создать уязвимость даже на первый взляд в защищенном коде. поэтому любое получение данных о пользователя должно:
1. Проверяться на размер введенных данных
2. На наличие недопустимых символов
3. Наличие паттернов командной строки



Ок. Спасибо, учту.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог