Перейти к содержанию

Глава 36. Трансформация контента

Действия трансформации позволяют модифицировать тело HTTP-ответа: заменять контент, инъектировать скрипты и стили, удалять активный контент.

36.1. transform(type, transformer) — трансформация

Применяет именованный трансформатор к телу HTTP-ответа. Трансформатор должен быть заранее объявлен через define одного из типов: define url_rewrite, define active_content или define javascript (см. главу 6).

Синтаксис:

transform(<content_type>, <transformer>)

where: content_type — тип контента: html, css, javascript, active_content; transformer — имя ранее объявленного трансформатора (define url_rewrite|active_content|javascript).

Тип: Нетерминальное.

Слои и транзакции: Proxy. Применяется к телу HTTP-ответа.

Несколько трансформаций — только через define action

Внутри слоя действует семантика BlueCoat «первое совпавшее правило выигрывает». Если на одно и то же условие написать несколько отдельных строк transform(...), применится только первая. Чтобы применить несколько трансформаций сразу, сгруппируйте их в одном define action и вызовите через action(...) — это штатная идиома BlueCoat (движок раскрывает action() во все вложенные действия).

Пример (одна трансформация):

define url_rewrite cdn_rw
  rewrite_url_prefix("http://old.cdn.example.com", "http://new.cdn.example.com")
end

<Proxy>
    url.path=/shop transform(html, cdn_rw)

Пример (несколько трансформаций — рекомендуемая идиома BlueCoat):

define url_rewrite cdn_rw
  rewrite_url_prefix("http://old.cdn.example.com", "http://new.cdn.example.com")
  rewrite_script_substring("OLD-BRAND", "NEW-BRAND")
end

define active_content strip_dangerous
  tag_replace script <<EOT
<!-- script removed -->
EOT
end

define javascript inject_monitor
  onload <<EOS
console.log("loaded:" + location.href);
EOS
end

define action shop_all
  transform(html, cdn_rw)
  transform(active_content, strip_dangerous)
  transform(javascript, inject_monitor)
  inject_css(http://cdn.test/style.css)
end

<Proxy>
    url.path=/shop action(shop_all)
    allow

Совместимость с BlueCoat. В BlueCoat внутри define action трансформатор вызывается «голым» синтаксисом transform <transformer_id> (без content_type и без скобок). Redcoat использует форму transform(content_type, transformer); семантика (применение трансформатора к телу ответа через define action/action()) совпадает.

См. также: replace, inject


36.2. replace(pattern, replacement) — замена в контенте

Заменяет содержимое тела ответа по регулярному выражению.

Синтаксис:

replace(<pattern>, <replacement>)

where: pattern — регулярное выражение (строка); replacement — строка замены.

Тип: Нетерминальное.

Слои и транзакции: Proxy. Применяется к HTTP-ответам.

Пример:

<Proxy>
    replace("http://old-cdn.com", "https://new-cdn.com")
    replace("internal\.corp", "public.example.com")

36.3. inject(position, content) — инъекция контента

Инъектирует HTML-контент в указанную позицию ответа.

Синтаксис:

inject(<position>, <content>)

where: position — позиция инъекции (см. таблицу); content — HTML-строка для вставки.

Позиция Описание Альтернативный синтаксис
head Внутри <head>
body_start Начало <body> body-start
body_end Конец </body> body-end
html_start Начало <html> html-start
html_end Конец </html> html-end

Тип: Нетерминальное.

Слои и транзакции: Proxy. Применяется к HTTP-ответам с Content-Type text/html.

Пример:

<Proxy>
    inject(head, "<meta name='proxy' content='redcoat'>")
    inject(body_end, "<script src='/analytics.js'></script>")

36.4. inject_script(url[, async]) — инъекция скриптов

Инъектирует тег <script> с указанным URL в HTML-ответ.

Синтаксис:

inject_script(<url>[, async|sync])

where: url — URL скрипта; async — загрузить асинхронно (атрибут async); sync — загрузить синхронно (по умолчанию).

Тип: Нетерминальное.

Слои и транзакции: Proxy. Применяется к HTML-ответам.

Пример:

<Proxy>
    inject_script("https://cdn.corp/monitoring.js")
    inject_script("https://cdn.corp/analytics.js", async)

См. также: inject_css


36.5. inject_css(url) — инъекция стилей

Инъектирует тег <link rel="stylesheet"> с указанным URL в HTML-ответ.

Синтаксис:

inject_css(<url>)

where: url — URL CSS-файла.

Тип: Нетерминальное.

Слои и транзакции: Proxy. Применяется к HTML-ответам.

Пример:

<Proxy>
    inject_css("https://cdn.corp/corporate-theme.css")

См. также: inject_script


36.6. strip_active_content — удаление активного контента

Удаляет активный контент (scripts, objects, iframes) из HTML-ответов. Защита от XSS и malware.

Синтаксис:

strip_active_content
strip_active_content(<type>[, <type>]*)

where: typescripts, objects, iframes. Без аргументов удаляются все три типа.

Тип: Нетерминальное.

Слои и транзакции: Proxy. Применяется к HTML-ответам.

Пример:

<Proxy>
    ; Удалить всё
    url.reputation=HighRisk strip_active_content

    ; Удалить только скрипты и iframes
    strip_active_content(scripts, iframes)

Комплексный пример:

<Proxy>
    ; Инъекция корпоративного баннера
    content-type=text/html inject(body_start, "<div id='corp-banner'>Corporate Network</div>")
    content-type=text/html inject_css("https://cdn.corp/banner.css")

    ; Мониторинг через JavaScript
    content-type=text/html inject_script("https://cdn.corp/monitoring.js", async)

    ; Удаление скриптов на подозрительных сайтах
    url.reputation=HighRisk content-type=text/html strip_active_content

    ; Замена старых URL
    replace("http://legacy.corp", "https://modern.corp")

    allow