Я как раз про механизм окрашивания, и написал, поясните
andylars 04.01.2016 14:17
/ 04.01.2016 14:24
Хорошо если как раз на этом примере будет разъяснено
что на самом деле
Я как раз и написал, что не помню (потому что помню, что помнил :)
но все время забываю, про механизм окрашивания и мне показалась
вот такой код ниже, небезопасным
Человек пишет:
$str[^taint[uri][$str]]
$result[^str.replace[/;%2F]]
Хотя, судя по всему он работает.
Поясните, тогда где я ошибаюсь - вот как я на это смотрю:
^taint
1) "помечает" строку (отдельно каждый символ строки и это тайное знание)
какой вид преобразования к строке (на самом деле к отдельному символу) применить непосредственно перед
отдачей (т.е. когда весь код завершился)
2) он не просто помечает, но и попутно выводит эту же переменную в этом же месте кода,
поэтому когда надо просто "пометить" необходимо присваивание $str[^taint[uri][$str]]
Возникает логический вопрос:
если преобразования "помеченной" строки возникают
только в конце исполнения, то все изменения
с этой строкой до завершения кода
только потом попадают под taint-фильтр (и это так, но!)
таким образом, да, ошибка восприятия в том,
что кажется очевидным, что если мы назначили
вид пост-фактум преобразования для строки,
а потом ДО этого преобразования изменили строку
replace-ом, то уже этот результат должен попасть
в конечном счете под taint-преобразование.
Но "дьявол", как водится, в деталях, и дело (как я понял)
именно в посимвольном пачкании (что не сильно афишируется в документации и именно поэтому и вводит в дальнейшие заблуждения)
И именно поэтому те символы уже помеченной строки, которые
я по коду изменю replace'ом поменяют свой taint на какой-то другой
(на какой?) на as-is или tainted ?
И именно поэтому эта часть строки
не будет затронута фильтром taint[uri]?
И как мы видим, код вида:
$str_1[a/b]
$str_1[^str_1.replace[/;%2F]]
$str_1[^taint[uri][$str_1]]
$str_2[a/b]
$str_2[^taint[uri][$str_2]]
$str_2[^str_2.replace[/;%2F]]
= $str_1
= $str_2
# Результат
= a%252Fb
= a%2Fb
Последовательность имеет значение,
только потому что replace - "депачкает" мой $str_1[^taint[uri]..]
в части replace-нутых символов
Вот это неявное перепачкивание и невозможность вывести
состояние "окрашенности" строки куда-то в отладку
и создает, как мне кажется, запутанность.
Почему replace - перепачкивает, а присвоение str[^taint[str]]
нет? ведь "код написанный программистом" это as-is?
Или распутаете мешанину в моей голове ))
P.S.: Поэтому я и написал, что если на 100% не уверен в том как это работает, то даже если это работает, лучше так не делать,
потому что механизм работает совсем не так, как аналог кода на Perl. И лучше использовать apply-taint - т.к. результат соответствует внутренним ожиданиям того, что хотел сделать автор.
- Без заголовка, Max 03.01.2016 05:38
- Ответ, andylars 03.01.2016 07:35
- Ответ, cmdz 03.01.2016 09:24 / 03.01.2016 09:25
- Ответ, andylars 03.01.2016 14:50 / 03.01.2016 15:47
- вы не совсем правы, Misha v.3 [M] 03.01.2016 23:24
- Я как раз про механизм окрашивания, и написал, поясните, andylars 04.01.2016 14:17 / 04.01.2016 14:24
- Ответ, G_Z [M] 04.01.2016 18:58 / 04.01.2016 19:06
- Ответ, andylars 04.01.2016 21:57 / 04.01.2016 22:00
- Ответ, cmdz 03.01.2016 19:13
- Ответ, andylars 03.01.2016 19:31