parser

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

 

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

Удивляет причем тут внешние данные

Maxx 06.02.2019 01:55

taint-инг конечно непростая тема, но мне кажется что-то тут не так. повторю пример для наглядности.
@main[]
$h[^hash::create[
	$.test[8"e"]
]]
$json[^json:string[$h]]

$json
# выводит { "test":"8\"e\"" }
^json.save[json.json]
# в файл попадает { "test":"8\"e\"" }
^connect[mysql]{
	^void:sql{insert into test set json = '$json'}
}
# в базу попадает {"test":"8"e""}
1. если чистые данные не экранируются, то почему в файл попадает экранированная строка? а в БД - нет?
2. можно немного модифицировать начало кода:
$h[^hash::create[
	 $.test[^string::sql[select '8"e"']] ^rem{теперь то тут грязная строка?}
]]
строчка стала грязной - но результат не изменился - в БД она попадает в "оригинальном виде" неэкранированной

3. А вообще - экранирование(тайнтинг) тут точно причем?
Разве при сериализации объекта (хэша в данном случае)
$json[^json:string[$h]]
значения полей хэша не должны уже попадать намертво экранированными строками?

У меня гипотеза что они попадают туда именно помеченными как json, но не сериализованными, независимо от чистоты. И это работает, пока мы не пытаемся писать в базу, где taint почему то сбрасывается и строки уходят "как есть". Но могу ошибаться, поправьте меня, если не трудно
^void:sql{insert into test set json = '^taint[$json]'}
Да, это работает. Но в файл то пишется как надо и без taint, вот это и непонятно