powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Экранирование SQL инъекций
20 сообщений из 20, страница 1 из 1
Экранирование SQL инъекций
    #40110746
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня,

надо проверить и вернуть если надо исправленную строку наподобии как это делает ParamByName при вставке значения в запрос.
Есть что то в дельфях готовое для этого?

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

Спасибо.
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40110748
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun,

Параметры экранировать никогда не требовалось.
Непонятно.
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40110753
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSery
hlopotun,

Параметры экранировать никогда не требовалось.
Непонятно.

потому что это делает фреймворк при вставке значения через ParamByName, а в данном случае просто складывают строки
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40110755
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunЕсть что то в дельфях готовое для этого?

RTFM AnsiQuoteString.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40110759
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
потому что это делает фреймворк при вставке значения через ParamByName, а в данном случае просто складывают строки
Какой фреймворк и зачем он это делает?
В параметр я любую фигню, хоть бинарные данные, могу спокойно заливать, к самому запросу эти данные вообще никакого отношения не имеют.

ЗЫ. А об экранировании уже ответил Дмитрий.
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40110786
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

hlopotunЕсть что то в дельфях готовое для этого?

RTFM AnsiQuoteString.

QuotedStr я уже там воткнул ранее, но всегда считал что это только защита от управляющих символов а не от самой инъекции (т.к. они бывают разные)
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40110828
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun,

только сейчас заметил что не в тото форум запостил.
Можно попросить админа перенести в Delphi?
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40110830
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
обнаружил в чужом коде что строку для запроса формируют через простое сложение строк и параметров
Такое выбрасывать надо сразу, как только увидел, а не пытаться скопировать/улучшить.
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40110831
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun,

вот так резали, если не получалось передавать в параметрах

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	<xsl:template match="/">
		<xsl:variable name="unallowed1">&apos;</xsl:variable>
		<xsl:variable name="unallowed2">(</xsl:variable>
		<xsl:variable name="unallowed3">||</xsl:variable>
		<xsl:variable name="unallowed4">;</xsl:variable>
		<xsl:variable name="unallowed5">"</xsl:variable>
		<xsl:variable name="unallowed6">{</xsl:variable>
        <xsl:choose>
           <xsl:when test="//*[contains(/*,$unallowed1)] or //*[contains(/*,$unallowed2)] or //*[contains(/*,$unallowed3)] or //*[contains(/*,$unallowed4)] or //*[contains(/*,$unallowed5)] or //*[contains(/*,$unallowed6)]">
                <xsl:message terminate="yes">
                   <xsl:text>contain unallowed symbol</xsl:text>
                </xsl:message>
           </xsl:when>
      	   <xsl:otherwise>
				     <xsl:apply-templates/>
		     </xsl:otherwise>
          </xsl:choose>
	</xsl:template>



Модератор: Тема перенесена из форума "Firebird, InterBase".
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111038
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модератор,
спасибо
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111055
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
наподобии как это делает ParamByName при вставке значения в запрос.
ParamByName ничего не экранирует, потому что у всех СУБД есть АПИ для параметризированных запросов
hlopotun
обнаружил в чужом коде что строку для запроса формируют через простое сложение строк и параметров. Поскольку там используют свой велосипед штатными средствами не поправить, надо хотябы экранировать параметры.
Неправильное решение. Правильное - нужно формировать параметризированный запрос и уже в него заливать параметры.

Т.е. вместо
Код: pascal
1.
2.
Query1.SQL.Text := 'SELECT * FROM mytable int_fld = ' +
  IntToStr(valInt) + ' AND str_fld = ''' + valStr + '''';

нужно писать так
Код: pascal
1.
2.
3.
Query1.SQL.Text := 'SELECT * FROM mytable int_fld = :p1 AND str_fld = :p2';
Query1.ParamByName('p1').AsInteger := valInt;
Query1.ParamByName('p2').AsString := valStr;
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111060
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ParamByName ничего не экранирует

Это у вменяемых компонент он ничего не экранирует, а в данном случае явно назван
древний фреймворк, сделанный рукожопом, где функция с названием ParamByName
может творить любую дичь.

_Vasilisk_Правильное - нужно формировать параметризированный запрос
Но это же пришлось бы исправлять чужой код. Топикстартер так не может, его
предел - заборчик из костылей вокруг чужих багов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111064
didgik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_

Т.е. вместо
Код: pascal
1.
2.
Query1.SQL.Text := 'SELECT * FROM mytable int_fld = ' +
  IntToStr(valInt) + ' AND str_fld = ''' + valStr + '''';

нужно писать так
Код: pascal
1.
2.
3.
Query1.SQL.Text := 'SELECT * FROM mytable int_fld = :p1 AND str_fld = :p2';
Query1.ParamByName('p1').AsInteger := valInt;
Query1.ParamByName('p2').AsString := valStr;


Всегда было интересно, как люди выкручиваются с параметрами, если запрос приходится собирать динамически.
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111074
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
где функция с названием ParamByName может творить любую дичь.
Ну тогда ТСу ничего не стоит посмотреть на исходник этой дичи
didgik
Всегда было интересно, как люди выкручиваются с параметрами, если запрос приходится собирать динамически.
А какие были еще варианты? У меня целый фреймворк есть, который формирует запросы на основании установленных свойств параметров. Что-то типа такого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TMyParam.Prepare(ABuilder: TStringBuilder);
begin
  ABuilder.Append(FieldName).Append(' ');
  if IsNull then
    ABuilder.Append('IS NULL')
  else if IsRange then
    ABuilder.AppendFormat('BETWEEN :%s AND :%0:s_to', [FieldName])
  else if IsStr and (Pos('%', FromVal) > 0) then
    ABuilder.AppendFormat('LIKE :%s', [FieldName])
  else
    ABuilder.AppendFormat('= :%s', [FieldName]);
end;

procedure TMyParam.Fill(ADataSet: TMyDataSet);
begin
  if IsNull then
    Exit;
  ADataSet.ParamByName(FieldName).AsVariant := FromVal;
  if IsRange then begin 
    ADataSet.ParamByName(FieldName + '_to').AsVariant := ToVal;
end;

...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111082
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
didgik
Всегда было интересно, как люди выкручиваются с параметрами, если запрос приходится собирать динамически.

А в чем проблема? После сборки текста набор из If FindParam('bla') then Param['bla'].Value := ...
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111097
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
didgik
Всегда было интересно, как люди выкручиваются с параметрами, если запрос приходится собирать динамически.
Вообще никакой разницы нет.
Сервер вообще не знает, динамический он или нет, для него все - динамические, потому и существует Prepare.
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111099
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
didgik
Всегда было интересно, как люди выкручиваются с параметрами, если запрос приходится собирать динамически.

А в чем проблема? После сборки текста набор из If FindParam('bla') then Param['bla'].Value := ...
Чаще всего можно и без FindParam обойтись. По той же логике, по которой и SQL изменяется - по ней же и значения доп. параметров указываются.
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111113
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
Всем доброго дня,

надо проверить и вернуть если надо исправленную строку наподобии как это делает ParamByName при вставке значения в запрос.
Есть что то в дельфях готовое для этого?

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

Спасибо.
И чо ? Большинство систем формируют строку динамически или из статической строки (которую вполне можно найти и подменить).
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111193
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
didgik
Всегда было интересно, как люди выкручиваются с параметрами, если запрос приходится собирать динамически.
Если TDataSet позволяет, использовать макросы (метод MacroByName).
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
Var
   QueryTable: string;
{...}
A := B;
MyQuery.SQL.Text := 'SELECT Name FROM %MyTable WHERE ID = :ID';
MyQuery.ParamByName('ID').Value := 1;
if A = B then QueryTable := 'Customers' else QueryTable := 'Producers';
MyQuery.MacroByName('MyTable') := QueryTable;
// Результат: SELECT Name FROM Customers WHERE ID = 1
...
Рейтинг: 0 / 0
Экранирование SQL инъекций
    #40111226
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Value забыл.
Код: pascal
1.
MyQuery.MacroByName('MyTable').Value := QueryTable;
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Экранирование SQL инъекций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]