Ответ
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]]
- Без заголовка, 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