Есть ли проверка на SQL-инъекции в TSQLQuery?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Есть ли проверка на SQL-инъекции в TSQLQuery?

Сообщение leo_bsv » 15.11.2010 16:58:33

Подскажите пожалуйста, не нашёл информации - проверяются ли данные, вводимые в объект класса TSQLQuery, на SQL-инъекции и корректность вводимых данных в случае:

А) SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Text:=s;
SQLQuery1.ExecSQL;

Б) SQLQuery1.Append;
SQLQuery1.Edit;
SQLQuery1.FieldByName('f1').AsString := Cells[_f1,r];
SQLQuery1.FieldByName('f2').AsString := Cells[_f2,r];
SQLQuery1.FieldByName('f3').AsString := Cells[_t3,r];
SQLQuery1.Post;
SQLQuery1.ApplyUpdates;
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Есть ли проверка на SQL-инъекции в TSQLQuery?

Сообщение Mr.Smart » 15.11.2010 17:48:44

Нет, не проверяются.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Есть ли проверка на SQL-инъекции в TSQLQuery?

Сообщение leo_bsv » 16.11.2010 00:49:46

Плохо. Спасибо.

Добавлено спустя 35 минут 7 секунд:
И действительно, было проверено следующим образом:
Код: Выделить всё
...
OQ : TSQLQuery;
...
...
// запрос данных из одного поля
function TMainForm.GetFromBase(s:string): string;
begin
  OQ.Close;
  OQ.SQL.Clear;
  OQ.SQL.Add(s);
  OQ.Open;
  OQ.First;
  result:=OQ.Fields.Fields[0].AsString;
end;
...

procedure TMainForm.Button4Click(Sender: TObject);
begin
  ShowMessage(GetFromBase('select x_field from table1 where field_id='+Edit1.Text+';'));
end;

..


При вводе в Edit1 текста вроде этого : -1 union select y_field from table2
Выдается ответ на второй запрос :D
Нужно быть аккуратнее :!:

Добавлено спустя 47 минут 46 секунд:
По-моему в паскале была какая-то функция по валидации SQL... или я что-то путаю?
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Есть ли проверка на SQL-инъекции в TSQLQuery?

Сообщение WindOfPain » 16.11.2010 09:10:32

На сколько я помню, для того, что бы не было возможности использовать SQL-инъекции,используются запросы с параметрами.

Например:
Код: Выделить всё
function TMainForm.GetFromBase(s:string): string;
begin
  OQ.Close;
  OQ.SQL.Clear;
  s:='select x_field from table1 where field_id= :field_id;'
  OQ.SQL.Add(s);
  QQ.Params.ParamByName('field_id').asInteger:=2;
  OQ.Open;
  OQ.First;
  result:=OQ.Fields.Fields[0].AsString;
end;


Если даже параметр будет asString и лепить туда '-1 union select y_field from table2', то набор данных будет фильтроваться по field_id = '-1 union select y_field from table2', а не отрабатываться 'select y_field from table2'
Аватара пользователя
WindOfPain
новенький
 
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

Рейтинг@Mail.ru