Глава 36. Трансформация контента¶
Действия трансформации позволяют модифицировать тело HTTP-ответа: заменять контент, инъектировать скрипты и стили, удалять активный контент.
36.1. transform(type, transformer) — трансформация¶
Применяет именованный трансформатор к телу HTTP-ответа. Трансформатор должен быть
заранее объявлен через define одного из типов: define url_rewrite,
define active_content или define javascript (см. главу 6).
Синтаксис:
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()) совпадает.
36.2. 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-контент в указанную позицию ответа.
Синтаксис:
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-ответ.
Синтаксис:
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-ответ.
Синтаксис:
where: url — URL CSS-файла.
Тип: Нетерминальное.
Слои и транзакции: Proxy. Применяется к HTML-ответам.
Пример:
См. также: inject_script
36.6. strip_active_content — удаление активного контента¶
Удаляет активный контент (scripts, objects, iframes) из HTML-ответов. Защита от XSS и malware.
Синтаксис:
where: type — scripts, 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