parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

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

Sumo 28.09 14:11 / 28.09 14:12

... и даже помечает данные как грязные, когда данные приходтят из внешних источников.

Когда данные могут быть смешанные мы можем явно испачкать без указания языка — ^taint[$value] — и этого достаточно.

Метод apply-taint сделали сильно позже для того, чтобы можно было применить преобразование и дальше что-то сделать, например записать в лог:
# Когда не нужно ничего явно преобразовывать достаточно покрасить,
# т.е. сказать парсеру — что value_json надо заэскейпить, если потребуется
# И Парсер сам всё сделать при исполнении sql:void
  ^connect[$connectString]{
      ^sql:void{
         insert into table1 (uuid, value_json, int_value, form_value) 
          values ('^math:uuid7[]', '^taint[^json:string[$data]]', ^i.int[], '$form:value')
      }
  }

# Если нам нужно отправить запрос и сохранить запрос в лог на диск,
# то в этом случае нам надо будет сделать apply-taint, чтобы в логе был корректный запрос
  ^connect[$connectString]{
#    Готовим запрос и сразу преобразоваваем
#    и явно эскейпим строку в контексте оператора connect
      $query[^apply-taint[sql][
         insert into table1 (uuid, value_json, int_value, form_value) 
          values ('^math:uuid7[]', '^taint[^json:string[$data]]', ^i.int[], '$form:value')
      ]]

#    Отправляем запрос в базу
      ^sql:void{$query}
  }

# А теперь пишем в лог запрос, но уже корректно заэскейпленный
  $now[^date::now[]]
  ^query.save[append; [^now.gmt-string[]] - $query^#0A]
Общее правило — не нужно нигде явно писать untaint, apply-taint и даже taint, если явно нет причины. Для остального обычно достаточно покрасить данные обычным ^taint[$value].