parser

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

 

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

Ответ

G_Z 04.01.2016 18:58 / 04.01.2016 19:06

1) "помечает" строку (отдельно каждый символ строки и это тайное знание)
какой вид преобразования к строке (на самом деле к отдельному символу) применить непосредственно перед
отдачей (т.е. когда весь код завершился)
Да.
2) он не просто помечает, но и попутно выводит эту же переменную в этом же месте кода,
поэтому когда надо просто "пометить" необходимо присваивание $str[^taint[uri][$str]]
Этот оператор возвращает помеченную строку, оставляя оригинал нетронутым.
если мы назначили
вид пост-фактум преобразования для строки,
а потом ДО этого преобразования изменили строку
replace-ом, то уже этот результат должен попасть
в конечном счете под taint-преобразование
Так и есть.
Покраска хранится посимвольно.
Измените символы или покраску символов — изменится результат преобразования всей строки.
И именно поэтому те символы уже помеченной строки, которые
я по коду изменю replace'ом поменяют свой taint на какой-то другой
(на какой?) на as-is или tainted ?
Зависит от того, как заменять.
Если в лоб — ^string.replace[а;б] — as-is, так как это написано в коде, если испачкать строку замены — замените на испачканное, с тем видом, которым пачкали — ^string.replace[а;^taint[uri;б]].
И именно поэтому эта часть строки
не будет затронута фильтром taint[uri]?
Это не фильтр.
При выводе строка преобразуется посимвольно, в соответствии с испачканностью.
Последовательность имеет значение
Конечно имеет.

В первом случае вы в чистой строке делаете чистую замену, а потом весь результат пачкаете как uri.
В результате, трансформация заменит всё, и получится двойное кодирование.

Во втором случае вы чистую строку пометили как uri, затем заменили / на %2F, на as-is символы.
И последующая трансформация при выводе эти символы не затронет, они чистые.
Вот это неявное перепачкивание и невозможность вывести
состояние "окрашенности" строки куда-то в отладку
и создает, как мне кажется, запутанность.
Оно вполне явное.
Вывести его можно с помощью ^apply-taint[].
Почему replace - перепачкивает, а присвоение str[^taint[str]]
нет? ведь "код написанный программистом" это as-is?
Он не «перепачкивает», он заменяет символы на те, что ему дают.
Они могут быть как чистые, так и испачканные, в зависимости от источника или явных манипуляций.

Присвоение — это присвоение, а не указание чистых символов в коде.
Иначе любое присвоение бы очищало данные.
@main[]
# чистая строка, написанная программистом
$str[абв]
# вся строка, помечена как небезопасные uri-данные
$str[^taint[uri;$str]]

# получим percent-закодированные символы всей строки
^apply-taint[$str]<br/>

# заменим символ грязной строки, на чистый символ, написанный программистом
$str[^str.replace[б;б]]

# получим percent-закодированные символы, кроме того, что заменён на чистый, он выведен как есть
^apply-taint[$str]<br/>

# заменим чистый символ на грязный вручную
$str[^str.replace[б;^taint[uri;б]]]

# снова получим percent-закодированные символы всей строки
^apply-taint[$str]