parser

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

 

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

Ответ

andylars 03.01.2016 14:50 / 03.01.2016 15:47

Писал с раннего утра - сорри.

в вашем случае
используйте ^apply-taint[uri][$str]
вместо ^taint

т.к. taint не меняет значение переменной вообще.
а лишь дает встроенному механизму фильтрации входящих/исходящих
данных инструкцию как преобразовать эту строку непосредственно
перед отдачей во вне (когда весь код уже исполнен)

Вашим кодом - в месте ^str.replace - вы делаете
не дополнительную шлифовку, а наоборт впервые меняете содержимое
строки + (скорее всего отменяете верхнюю по коду рекомендацию ^taint[uri] на [as-is] (тут нужны комментарии более опытных, я не помню всех случаев как он отрабатывает)

^taint - отдельный оператор и не метод класса string, это совсем иная история.
И может получится так, что строка вида:
a/b - станет => сначала a%2Fb
и отрабатываемый лишь в конце фильтра uri
может превратить уже существующее a%2Fb в => a%252Fb
то есть произойдет двойное преобразование и кодирование самого символа %

плюс (не уверен за Perl) есть ли корректное кодирование utf-8 символов? т.к. они кодируются видом: %u0430

Код ниже форсировано закодирует в %hex все символы
причем корректно (в случае с utf)
и сразу по коду (не бойтесь вы приставки js у метода)
это все равно метод класса string и он просто кодирует
чуть больше символов чем
тем более, что вам и слеш и точки кодировать надо
$_tab[^table::create{from to
+	%2B
*	%2A	
-	%2D
.	%2E
/	%2F
_	%5F
\	%5C
}]
$_str[^_str.js-escape[]]
$_str[^_str.replace[$_tab]]