Opuntainttaint
untaint, taint. Преобразование данных | |
^untaint{код}
^untaint[вид преобразования]{код}
^taint[текст]
^taint[вид преобразования][текст]
Оператор taint помечает весь переданный ему текст, как нуждающийся в преобразовании заданного вида. Оператор untaint выполняет переданный ему код и помечает, как нуждающиеся в преобразовании, те части результата выполнения кода, которые не являлись частью кода на Parser, а поступили извне, например, из полей формы.
Если вид преобразования не указан, оператор untaint делает преобразование вида as-is, а оператор taint помечает текст как tainted (неопределенно «грязный», без указания вида преобразования).
Само преобразование Parser выполняет позже, при выдаче результата обработки документа пользователю, перед выполнением SQL-запроса или отправкой письма.
Преобразование заключается в замене одних символов на другие в соответствии с внутренними таблицами пребразований. Предусмотрены следующие виды преобразований:
as-is
file-spec
http-header
mail-header
uri
sql
js
xml
html
optimized-as-is
optimized-xml
optimized-html
Выполняемые замены для каждого вида преобразования сведены в таблице ниже.
Важное замечание: «чистый» код также подвергается автоматическому преобразованию. Parser выполняет оптимизацию по «white spaces» (символы пробела, табуляция, перевода строки). Идущие подряд перечисленные символы заменяются только одним, который встречается в коде первым. В общем виде можно представить весь набираемый код следующим образом:
^untaint[optimized-html]{здесь находится код, набранный скриптовальщиком}
Необходимо учитывать это при создании кода! Схема автоматического преобразования Parser - optimized-html.
Пример:
Пример на ^^untaint.<br>
<form>
<input name=field>
<input type=submit>
</form>
$tainted[$form:field]
"Грязные" данные - $tainted<br>
"Чистые" данные - ^untaint{$tainted}
В результате выполнения этого кода поступившие через поля формы данные не будут преобразовываться Parser и выдадутся в том виде, в каком они поступили. В квадратных скобках оператора untaint задается вид выполняемого преобразования. Здесь мы опускаем квадратные скобки в методе untaint и используем параметр по умолчанию [as-is].
Как уже было сказано выше, большую часть работы по преобразованию данных Parser выполняет автоматически. Внешние данные, которые используются в «чистом» коде преобразуются к optimized-html.
Оператор taint также помечает преобразование данных в соответствии с указанной таблицей, но, в отличие от untaint, используется для «чистых» данных, т.е. созданных кодером, либо поступивших извне и уже обработанных untaint. Еще раз обращаем внимание, что преобразование происходит только в момент выдачи данных во внешнюю среду (пользователю, в файл или базу данных). Если не задан вид преобразования, данные останутся "грязными", но никаких замен сделано не будет.
Пример
Пример ^^taint.<br>
$town[Москва]
<a href="town.html?^taint[uri][$town]">$town</a>
В результате данные, хранящиеся в переменной town, будут преобразованы к типу URI. Русские буквы будут заменены на шестнадцатеричные коды символов и представлены в виде %ХХ.
Таблицы преобразований
as-is | изменений в тексте не делается |
file-spec | символы * ? ' " < > | преобразуются в "_XX", где XX - код символа в шестнадцатеричной форме |
uri | символы за исключением цифр, строчных и прописных латинских букв, а также следующих символов: _ - . " преобразуется в %XX где XX - код символа в шестнадцатеричной форме |
http-header | то же, что и URI |
mail-header | если известен charset (если неизвестен, не будут работать up/low case), то фрагмент, начиная с первой буквы с восьмым битом и до конца строки, будет представлен в подобном виде: Subject: Re: parser3: =?koi8-r?Q?=D3=C5=CD=C9=CE=C1=D2?= |
sql | в зависимости от SQL-сервера для Oracle/ODBC меняется ' на '' для PgSQL меняется ' на '' и \ на \\ для MySQL делается средствами самого MySQL |
js | " преобразуется в \" ' преобразуется в \' \ преобразуется в \\ символ конца строки преобразуется в \n символ с кодом 0xFF предваряется \ |
xml | & преобразуется в & > преобразуется в > < преобразуется в < " преобразуется в " ' преобразуется в ' |
html | & преобразуется в & > преобразуется в > < преобразуется в < " преобразуется в " |
optimized-as-is optimized-xml optimized-html | дополнительно к заменам выполняется оптимизация по "white spaces" (символы пробела, табуляция, перевода строки). Идущие подряд перечисленные символы заменяются только одним, который встречается в коде первым |
br>
Ряд taint преобразований Parser делает автоматически, так, имена и пути файлов всегда автоматически file-spec преобразуются, и когда вы пишите…
^file::load[filename]
…Parser выполняет…
^file::load[^taint[file-spec][filename]]
Аналогично, при задании HTTP-заголовков и заголовков писем, происходят http-header и mail-header преобразования соответственно. А при DOM-операциях текстовые параметры всех методов автоматически xml преобразуются.
Также Parser выполняет ряд автоматических untaint преобразований:
вид |
что преобразуется |
sql |
тело SQL-запроса |
xml |
XML код при создании объекта класса xdoc |
Copyright © 1997?2004 Art. Lebedev Studio | http://www.artlebedev.ru | Дата обновления: 28.05.2004 |