untaint. Задание преобразований данных

^untaint{код}
^untaint[вид преобразования]{код}

Оператор
untaint выполняет переданный ему код и помечает как нуждающиеся в преобразовании заданного вида только неопределенно «грязные» части результата выполнения кода (т. е. те, которые не являлись частью кода на Parser, написанного разработчиком в теле документов, а поступили извне или которые были помечены как tainted с помощью оператора taint без первого параметра). Он не трогает те части, для которых уже задан конкретный вид преобразования. Если вид преобразования не указан, оператор untaint помечает неопределенно «грязные» части результата выполнения кода как as-is.

Данный оператор лишь делает пометки в тексте о виде преобразования, которое Parser должен будет произвести
позже, но не производит его сиюминутно. Сами преобразования Parser выполняет или при выполнении оператора apply-taint, или при выдаче текста в браузер, перед выдачей SQL-серверу, при сохранении в файл, при отправке письма и т. п.

В некоторых случаях результаты работы
^taint[вид преобразования][текст] и ^untaint[вид преобразования]{текст} одинаковые: это происходит тогда, когда весь обрабатываемый текст является неопределенно «грязным» (например, $form:field). Однако нужно быть внимательным: применение к неопределенно «грязному» тексту этих операторов без первого параметра даст совершенно разные результаты, т. к. опущенные значения первого параметра у них различны.

Схема автоматического преобразования Parser при выдаче данных в браузер -
optimized-html, и в общем виде можно представить весь набираемый разработчиком код следующим образом:
^untaint[optimized-html]{весь код, как набранный разработчиком, так и пришедший извне}

Это означает, что, если написать в теле страницы $form:field (без всяких taint/untaint), то даже при обращении к ней с параметром «?field=</html>», это не «поломает» страницу из-за досрочно выведенного в нее закрывающего тега </html>, т. к. содержимое $form:field неопределенно «грязное», и поэтому к нему будет применено автоматическое преобразование optimized-html, с помощью которого символы < и > будут заменены &lt; и &gt; соответственно.

Пример
<form>
<input 
type="text" name="field" />
<input type="submit" />
</form>

$tainted[$form:field]
«Грязные» данные - $tainted<br />
«Чистые» данные - 
^untaint{$tainted}


В квадратных скобках оператора
untaint задается вид выполняемого преобразования. Здесь мы опускаем квадратные скобки в операторе untaint и используем значение преобразования по умолчанию [as-is].

Внимание! Если оператор
untaint без указания вида преобразования полностью эквивалентен оператору untaint с указанием вида преобразования as-is, то для оператора taint не существует такого вида преобразования, который равнозначен оператору taint без указания оного.

Может возникнуть вопрос, для чего вообще нужен оператор untaint. Продемонстрируем пару вариантов его практического применения.

Во-первых, иногда его использование позволяет уменьшить количество операторов
taint в коде, например, при выводе данных в форму, содержащую много полей, и при необходимости отключить оптимизацию пробельных символов. В этом случае вместо того, чтобы писать ^taint[html][...] вокруг вывода содержимого каждой textarea, можно написать один раз ^untaint[html]{...} вокруг всей формы.


Пример

Выдача даннных (могут содержать теги), пришедших от пользователя или из БД
в большую форму для редактирования с сохранением пробельных символов<br />
^if(def $form:title){
   
$data[$form:fields]
}{
   ^connect[$SQL.connect-string]{
   
   $data[^table::sql{SELECT title, lead, body FROM news WHERE news_id = $id}]
   
}
}

^untaint[html]{
   <p>
   
   <b>Заголовок:</b><br />
      <textarea name="title">$data.title</textarea>
   </p>
   <p>

      <b>Анонс:</b><br />
      <textarea name="lead">$data.lead</textarea>
   </p>
   <p>

      <b>Текст новости:</b><br />
      <textarea name="body">$data.body</textarea>
   </p>
}


И во-вторых, когда нам нужно выдать в браузер xml, а не html (например, для ajax, RSS, SOAP и т. п.). В этом случае автоматическое преобразование (
optimized-html) не подходит, поэтому вокруг всего кода нужно написать ^untaint[optimized-xml]{...} и расслабиться :)




Copyright © 1997–2024 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 25.09.2024