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

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

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

Ответить
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

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

Сообщение leo_bsv »

Подскажите пожалуйста, не нашёл информации - проверяются ли данные, вводимые в объект класса 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;
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Нет, не проверяются.
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

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

Добавлено спустя 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... или я что-то путаю?
Аватара пользователя
WindOfPain
новенький
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург

Сообщение WindOfPain »

На сколько я помню, для того, что бы не было возможности использовать 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'
Ответить