parser

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

 

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

Я как раз про механизм окрашивания, и написал, поясните

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 - т.к. результат соответствует внутренним ожиданиям того, что хотел сделать автор.