Обработка HTTP-сообщений на Lua

В этом разделе

Общие сведения

Скрипт для обработки сообщений

Используемые таблицы

Доступные вспомогательные модули

Общие сведения

Компонент Dr.Web ICAPD поддерживает взаимодействие с интерпретатором программ на языке Lua (используется версия 5.3.4; поставляется совместно с Dr.Web для интернет-шлюзов UNIX). Скрипты на Lua могут использоваться компонентом для анализа и обработки сообщений протокола HTTP.

Анализ HTTP-сообщения (запроса или ответа), поступившего на проверку от прокси-сервера по протоколу ICAP, выполняется при помощи скрипта на языке Lua, указанного в настройках Dr.Web ICAPD в соответствующем параметре MessageHook (может быть указан как текст скрипта, так и путь к файлу скрипта).

Скрипт для обработки сообщений

Требования к скрипту

Скрипт должен содержать глобальную функцию, являющуюся точкой входа в модуль проверки сообщений (эту функцию Dr.Web ICAPD будет вызывать для обработки вновь поступившего сообщения). Функция обработки должна соответствовать следующим соглашениям о вызове:

1.Имя функции — message_hook;

2.Единственный аргумент — таблица MessageContext (предоставляет из функции доступ к информации об обрабатываемом сообщении);

3.Единственное возвращаемое значение — строка. Возвращаемое значение определяет вердикт относительно проверяемого сообщения: пропустить его или заблокировать. Возможные значения:

"pass" — HTTP-сообщение будет передано получателю (HTTP-запрос — к серверу, HTTP-ответ — к клиенту).

"block" — HTTP-сообщение не будет передано получателю, клиент получит HTTP-ответ с веб-страницей блокировки.

Ситуации, когда функция возвращает иное значение или же во время ее выполнения происходит ошибка, интерпретируются как ошибка проверки; ответ клиенту в таких случаях зависит от значения параметра BlockUnchecked.

Ниже приведен пример корректного определения функции, которая всегда будет возвращать в Dr.Web ICAPD вердикт Pass (пропустить) для всех проверяемых HTTP-сообщений (здесь и далее аргумент ctx — экземпляр таблицы MessageContext):

function message_hook(ctx)
  return "pass"
end

Следующий скрипт заблокирует доступ ко всем ресурсам, кроме сайта c документацией компании «Доктор Веб» для всех пользователей, кроме членов группы Web Admins в Active Directory:

local dwl = require "drweb.lookup"

function message_hook(ctx)

  -- Не блокировать доступ к ресурсам на сайте документации
  -- компании «Доктор Веб»
  if ctx.req.url.in_list{"download.geo.drweb.com"} then
      return "pass"
  end

  -- Разрешить доступ пользователям из группы WebAdmins
  -- в Active Directory
  if dwl.check("WebAdmins", "AD@WinRoot", ctx.icap.user) then
      return "pass"
  end

  -- Заблокировать доступ всем остальным (ко всем ресурсам)
  return "block"

end

Используемые таблицы

Таблица MessageContext

Используется как входной аргумент функции message_hook, содержит информацию об обрабатываемом HTTP-сообщении (его тип, заголовки, тело, а также информация об отправителе и получателях, если она доступна).

Поле

Описание

Тип данных

direction

Тип HTTP-сообщения:

"request" — HTTP-запрос.

"response" — HTTP-ответ.

Строка

icap

Информация о заголовках ICAP-запроса.

Таблица ICAP

request

Информация о заголовках HTTP-запроса.

Таблица Request

response

Информация о заголовках HTTP-ответа.

Таблица Response

body

Информация о теле HTTP-сообщения.

Таблица Body

Переопределенные метаметоды: Нет

Таблица ICAP

Используется как поле icap таблицы MessageContext. Хранит информацию об ICAP-запросе от прокси-сервера HTTP.

Поле

Описание

Тип данных

user

Информация о пользователе, полученная из заголовка X-Client-Username в ICAP-запросе.

Таблица User

src

IP-адрес клиента, отправившего запрос, (содержится в ICAP-запросе от прокси-сервера, в заголовке X-Client-IP), либо nil, если адрес неизвестен.

Таблица IpAddress

field

Массив заголовков ICAP-запроса.

Массив таблиц HeaderField

search

Функция для поиска заголовка по регулярному выражению. Принимает один обязательный аргумент patterns — шаблоны поиска, т. е. одно (строка) или несколько (массив строк) регулярных выражений в синтаксисе Perl (PCRE). Выполняет поиск по всем имеющимся заголовкам. Обратите внимание, что при использовании строк в кавычках символ косой черты необходимо экранировать.

Возвращает возвращает логическое значение:

true — если для хотя бы у одного заголовка строка field.name .. ": " .. field.value.decoded соответствует хотя бы одному из заданных регулярных выражений;

false — если соответствий не обнаружено.

Функция

value

Функция, принимающая один обязательный аргумент — имя заголовка (строка). Возвращает значение, первого заголовка с указанным именем, либо nil, если заголовка с таким именем нет.

Функция

Переопределенные метаметоды: Нет

Таблица User

Таблица содержит имя пользователя и домен; оба ее поля необязательны.

Поле

Описание

Тип данных

user

Имя пользователя.

Строка

domain

Домен пользователя.

Строка

Переопределенные метаметоды:

__tostring — функция, возвращающая содержимое User в виде строки (в кодировке UTF-8);

__concat — функция, присоединяющая преобразованное в строку значение User к строке.

Таблица HeaderField

Таблица описывает HTTP- или ICAP-сообщения.

Поле

Описание

Тип данных

name

Имя заголовка.

Строка

value

Значение заголовка.

Строка

Переопределенные метаметоды: Нет

Таблица Request

Таблица описывает заголовки HTTP-запроса.

Поле

Описание

Тип данных

method

Метод протокола HTTP, указанный в запросе (например, "POST"), либо nil, если ICAP-запрос не включает заголовок HTTP-запроса.

Строка

url

URL ресурса, на который направлен HTTP-запрос.

Таблица Url

content_type

Информация, полученная из заголовка Content-Type HTTP-запроса.

Таблица ContentType

field

Массив заголовков HTTP-запроса.

Массив таблиц HeaderField

search

Функция для поиска заголовка по регулярному выражению. Принимает один обязательный аргумент patterns — шаблоны поиска, т. е. одно (строка) или несколько (массив строк) регулярных выражений в синтаксисе Perl (PCRE). Выполняет поиск по всем имеющимся заголовкам. Обратите внимание, что при использовании строк в кавычках символ косой черты необходимо экранировать.

Возвращает булево значение:

true — если для хотя бы одного заголовка строка field.name .. ": " .. field.value.decoded соответствует хотя бы одному из заданных регулярных выражений;

false — если соответствий не обнаружено

Функция

value

Функция, принимающая один обязательный аргумент — имя заголовка (строка). Возвращает значение, первого заголовка с указанным именем, либо nil, если заголовка с таким именем нет.

Функция

Переопределенные метаметоды: Нет

Таблица ContentType

Таблица описывает значение, полученное из заголовка Content-Type.

Поле

Описание

Тип данных

type

MIME-тип части сообщения

Строка

subtype

Подтип части сообщения

Строка

param

Параметры заголовка в виде массива таблиц, содержащих следующие поля:

name — имя параметра (строка);

value — значение параметра (строка).

Массив таблиц

match

Функция, принимающая один обязательный аргумент media_types — массив строк, описывающих MIME-типы. Каждая строка должна иметь вид "тип/подтип", "тип/*" или "*/*".

Возвращает логическое значение:

true — если MIME-тип тела соответствует одной из указанных строк (регистр не учитывается) или переданный массив содержит строку "*/*".

false — если соответствий не обнаружено.

Функция

Переопределенные метаметоды:

__tostring — функция, возвращающая раскодированное значение заголовка;

__concat — функция, присоединяющая раскодированное значение заголовка к строке.

Таблица Url

Таблица описывает URL.

Поле

Описание

Тип данных

scheme

Префикс схемы (протокола), например — "http". Если отсутствует — nil.

Строка

host

Имя или IP-адрес узла, например — "example.com". Если отсутствует — nil.

Строка

port

Номер порта, например — 80. Если отсутствует — nil.

Число

path

Путь к ресурсу, например — "index.html". Если отсутствует — nil.

Строка

query

Декодированные параметры запроса. Если отсутствуют — nil.

Строка

legal_url

В случае принадлежности URL категории owners_notice содержит строку с URL, ведущим на веб-сайт правообладателя, иначе — nil.

Строка

in_list

Функция, принимающая один обязательный аргумент hosts — список доменов (массив строк). Возвращает логиче6ское значение:

true — если host является поддоменом одного из указанных доменов либо совпадает с одним из них;

false — если совпадений не обнаружено

Функция

categories

Функция, принимающая один необязательный аргумент filter — таблицу UrlCategoryFilter (отсутствие аргумента равносильно использованию пустой таблицы). Возвращает функцию-итератор, с помощью которой можно перебрать все категории, удовлетворяющие заданным с помощью filter условиям, к которым относится URL.

Функция

in_categories

Функция, принимающая один обязательный аргумент categories — список категорий URL (массив строк). Возвращает логическое значение:

true — если URL относится хотя бы к одной из указанных категорий;

false — если URL ни к одной из категорий не относится.

Если массив categories пустой, всегда возвращает false. Возможные значения категорий см. в описании поля category таблицы UrlCategoryFilter.

Функция

raw

Нераскодированный URL в «сыром» виде.

Таблица RawUrl

Переопределенные метаметоды:

__tostring — функция, возвращающая содержимое Url в виде строки (в кодировке UTF-8);

__concat — функция, присоединяющая к строке преобразованное в строку значение Url.

Таблица RawUrl

Таблица содержит информацию об URL в нераскодированном виде.

Поле

Описание

Тип данных

scheme

Префикс схемы (протокола), например — "http". Если отсутствует — nil.

Строка

host

Имя или IP-адрес узла, например — "example.com". Если отсутствует — nil.

Строка

port

Номер порта, например — 80. Если отсутствует — nil.

Число

path

Путь к ресурсу, например — "index.html". Если отсутствует — nil.

Строка

query

Декодированные параметры запроса. Если отсутствуют — nil.

Строка

Переопределенные метаметоды:

__tostring — функция, возвращающая содержимое RawUrl в виде строки (в кодировке UTF-8);

__concat — функция, к строке присоединяющая преобразованное в строку значение RawUrl.

Таблица UrlCategoryFilter

Таблица описывает фильтр для категорий URL. Все ее поля являются необязательными.

Поле

Описание

Тип данных

category

Список категорий, которым должен соответствовать URL (нечувствительно к регистру):

"infection_source" — источник распространения угроз;

"not_recommended" — не рекомендуемый к посещению;

"adult_content" — материалы для взрослых;

"violence" — насилие;

"weapons" — оружие;

"gambling" — азартные игры;

"drugs" — наркотики;

"obscene_language" — нецензурная лексика;

"chats" — чаты;

"terrorism" — терроризм;

"free_email" — бесплатная электронная почта;

"social_networks" — социальные сети;

"owners_notice" — веб-сайты, добавленные по обращению правообладателей;

"online_games" — онлайн-игры;

"anonymizers" — анонимайзеры;

"cryptocurrency_mining_pools" — пулы майнеров криптовалют;

"jobs" — веб-сайты для поиска работы;

"black_list" — черный список.

Строка или таблица строк

category_not

Перечень категорий, которым не должен соответствовать URL (нечувствительно к регистру).

Строка или таблица строк

Переопределенные метаметоды: Нет

Если поле фильтра не задано (т. е. указано значение nil), то любая угроза соответствует фильтру. Если указаны несколько полей фильтра, то условие объединяется по конъюнкции (логическое «И»). Если тип поля фильтра — это таблица (список), то фильтруемый объект должен соответствовать хотя бы из ее элементов.

Таблица Response

Таблица описывает заголовки HTTP-ответа.

Поле

Описание

Тип данных

status

Код ответа HTTP, либо nil, если ICAP-запрос не включает заголовок HTTP-ответа.

Число

reason

Пояснение к коду ответа, либо nil, если отсутствует.

Строка

content_type

Содержит информацию, полученную из заголовка Content-Type HTTP-ответа.

Таблица ContentType

field

Массив заголовков HTTP-ответа.

Массив таблиц HeaderField

search

Функция поиска заголовка по регулярному выражению. Принимает один обязательный аргумент patterns — шаблоны поиска, т. е. одно (строка) или несколько (массив строк) регулярных выражений в синтаксисе Perl (PCRE). Выполняет поиск по всем имеющимся заголовкам. Обратите внимание, что при использовании строк в кавычках символ косой черты необходимо экранировать.

Возвращает логическое значение:

true — если для хотя бы одного заголовка строка field.name .. ": " .. field.value.decoded соответствует хотя бы одному из заданных регулярных выражений;

false — иначе.

Функция

value

Функция, принимающая один обязательный аргумент — имя заголовка (строка). Возвращает значение, первого заголовка с указанным именем, либо nil, если заголовка с таким именем нет.

Функция

Переопределенные метаметоды: Нет

Таблица Body

Таблица описывает тело HTTP-сообщения.

Поле

Описание

Тип данных

has_threat

Функция, принимающая один необязательный аргумент filter — таблицу ThreatFilter (отсутствие аргумента равносильно использованию пустой таблицы). Возвращает булево значение:

true — если тело HTTP-сообщения содержит угрозу, соответствующую указанному условию filter;

false — иначе.

Функция

threats

Функция, принимающая один необязательный аргумент filter — таблицу ThreatFilter (отсутствие аргумента равносильно использованию пустой таблицы). Возвращает функцию-итератор, с помощью которой можно перебрать все угрозы, найденные в теле HTTP-сообщения. Угрозы описываются с помощью таблицы Virus.

Функция

content_type

Содержит информацию о MIME-типе тела, полученную из заголовка Content-Type HTTP-запроса или ответа (в зависимости от того, тело сообщения какого типа анализируется).

Таблица ContentType

scan_error

Ошибка проверки тела, если произошла, иначе — nil. Возможные значения:

"path_not_absolute" — указан не абсолютный путь;

"file_not_found" — файл не найден;

"file_not_regular" — специальный файл;

"file_not_block_device" — не блочное устройство;

"name_too_long" — слишком длинное имя;

"no_access" — нет доступа;

"read_error" — ошибка чтения;

"write_error" — ошибка записи;

"file_too_large" — файл слишком большой;

"file_busy" — файл используется;

"unpacking_error" — ошибка распаковки;

"password_protected" — архив защищен паролем;

"arch_crc_error" — ошибка CRC архива;

"arch_invalid_header" — ошибочный заголовок архива;

"arch_no_memory" — не хватает памяти для распаковки архива;

"arch_incomplete" — неполный архив;

"can_not_be_cured" — файл не может быть вылечен;

"packer_level_limit" — превышение предельного уровня вложенности для упакованного объекта;

"archive_level_limit" — превышение предельного уровня вложенности для архива;

"mail_level_limit" — превышение предельного уровня вложенности для почтового файла;

"container_level_limit" — превышение предельного уровня вложенности для контейнера;

"compression_limit" — превышение предельной величины коэффициента сжатия;

"report_size_limit" — превышение предельного размера отчета;

"scan_timeout" — превышение предельного времени проверки;

"engine_crash" — сбой антивирусного ядра;

"engine_hangup" — зависание антивирусного ядра;

"engine_error" — ошибка антивирусного ядра;

"no_license" — отсутствует действующая лицензия;

"multiscan_too_late" — ошибка многопоточной проверки;

"curing_limit_reached" — превышение предельного числа попыток лечения;

"non_supported_disk" — неподдерживаемый тип диска;

"unexpected_error" — неожиданная ошибка.

Строка

Переопределенные метаметоды: Нет

Таблица Virus

Таблица описывает угрозу.

Поле

Описание

Тип данных

name

Имя угрозы (по классификации «Доктор Веб»)

Строка

type

Тип угрозы (по классификации «Доктор Веб»). Возможные значения:

"known_virus" — известная угроза (т. е. угроза, имеющая описание в вирусных базах);

"virus_modification" — модификация известной угрозы;

"unknown_virus" — неизвестная угроза, подозрительный объект;

"adware" — рекламная программа;

"dialer" — программа дозвона;

"joke" — программа-шутка;

"riskware" — потенциально опасное ПО;

"hacktool" — программа взлома.

Строка

Переопределенные метаметоды: Нет

Таблица ThreatFilter

Таблица описывает фильтр для угроз.

Поле

Описание

Тип данных

category

Перечень категорий, которым должна соответствовать угроза (нечувствительно к регистру), список категорий см. в описании поля type таблицы Virus.

Строка или таблица строк

category_not

Перечень категорий, которым не должна соответствовать угроза (нечувствительно к регистру).

Строка или таблица строк

Переопределенные метаметоды: Нет

Если поле фильтра не задано (т. е. указано значение nil), то любая угроза соответствует фильтру. Если указаны несколько полей фильтра, то условие объединяется по конъюнкции (логическое «И»). Если тип поля фильтра — это таблица (список), то фильтруемый объект должен соответствовать хотя бы одному из элементов таблицы (списка).

Примеры использования:

1.Вывод в журнал перечня всех угроз, найденных в HTTP-сообщении:

local dw = require "drweb"

function message_hook(ctx)
  for virus in ctx.body.threats() do
   dw.notice("threat found: " .. virus.name)
  end
  return "pass"
end

2.Вывод в журнал перечня угроз, соответствующих фильтру по категории, и имен частей сообщения, в которых они были обнаружены:

local dw = require "drweb"

function message_hook(ctx)
  for v in ctx.body.threats({category = "known_virus"}) do
   dw.notice("found known virus: " .. v.name)
  end
  return "pass"
end

Доступные вспомогательные модули

Для взаимодействия с Dr.Web для интернет-шлюзов UNIX в пространство Lua-программы могут быть импортированы следующие специфические модули, перечисленные в таблице.

Имя модуля

Назначение

Модуль предоставляет функции для записи сообщений из Lua-программы в журнал компонента Dr.Web для интернет-шлюзов UNIX, запустившего программу на Lua, а также средства асинхронного запуска Lua-процедур.

Модуль, предоставляющий инструменты для запроса данных из внешних источников путем обращения к модулю Dr.Web LookupD.

Модуль, предоставляющий интерфейс сопоставления строк с регулярными выражениями.

Модуль, предоставляющий таблицу, содержащую значения параметров конфигурации Dr.Web ICAPD.

Содержимое модуля drweb

1.Функции

Модуль предоставляет набор функций.

Для записи сообщений из программы Lua в журнал компонента Dr.Web для интернет-шлюзов UNIX:

log(<уровень>, <сообщение>) записывает строку <сообщение> в журнал Dr.Web для интернет-шлюзов UNIX на уровне <уровень> (требуемый уровень задается строкой: «debug», «info», «notice», «warning», «error»);

debug(<сообщение>) записывает строку <сообщение> в журнал Dr.Web для интернет-шлюзов UNIX на уровне DEBUG;

info(<сообщение>) записывает строку <сообщение> в журнал Dr.Web для интернет-шлюзов UNIX на уровне INFO;

notice(<сообщение>) записывает строку <сообщение> в журнал Dr.Web для интернет-шлюзов UNIX на уровне NOTICE;

warning(<сообщение>) записывает строку <сообщение> в журнал Dr.Web для интернет-шлюзов UNIX на уровне WARNING;

error(<сообщение>) записывает строку <сообщение> в журнал Dr.Web для интернет-шлюзов UNIX на уровне ERROR.

Для управления синхронизацией Lua-процедур:

sleep(<с>) приостанавливает выполнение экземпляра процедуры Lua на указанное число секунд;

async(<функция Lua>[, <список аргументов>]) асинхронно запускает указанную функцию с передачей ей заданного списка аргументов. Вызов функции async завершается немедленно, возвращаемое значение (таблица Future) позволяет получить результат выполнения функции <функция Lua>.

Для представления информации об IP-адресе в виде таблицы IpAddress:

ip(<адрес>) представляет IP-адрес, переданный в виде строки <адрес>, экземпляром таблицы IpAddress. Допускается использовать как IPv4-, так и IPv6.

Для загрузки внешних данных из текстового файла:

load_set(<путь к файлу>) формирует из содержимого указанного текстового файла таблицу со значениями true; в качестве ключей используются строки, прочитанные из файла. Пустые строки и строки, состоящие только из пробельных символов будут проигнорированы;

load_array(<путь к файлу>) формирует из содержимого указанного текстового файла массив строк. Пустые строки и строки, состоящие только из пробельных символов будут проигнорированы.

2.Таблицы

Таблица Future описывает отложенный результат выполнения функции при помощи функции async.

Поле

Описание

Тип данных

wait

Функция, возвращающая результат функции, запущенной при помощи функции async. Если функция еще не завершила свое выполнение, ожидает завершения и возвращает результат. Если функция завершилась до момента вызова wait, результат возвращается немедленно. Если запущенная функция завершилась с ошибкой, вызов wait генерирует ту же ошибку.

Функция

Переопределенные метаметоды: Нет

Таблица IpAddress описывает IP-адрес.

Поле

Описание

Тип данных

belongs

Функция для проверки IP-адреса из таблицы IpAddress на принадлежность указанным подсетям (диапазонам IP-адресов).

Принимает единственный аргумент — массив строк вида "<IP-адрес>" или "<IP-адрес>/<маска>", где <IP-адрес> — адрес узла либо сети (например, "127.0.0.1"), а <маска> — маска подсети, которая указывается в виде IP-адреса (например, "255.0.0.0"), либо в виде числа (например, "8").

Возвращает логическое значение:

true — если адрес совпадает хотя бы с одним из указанных IP-адресов либо принадлежит хотя бы одной из указанных подсетей (диапазону IP-адресов);

false — если адрес не совпадает ни с одним из указанных или не принадлежит ни одной из указанных подсетей

Функция

Переопределенные метаметоды:

__tostring — функция, преобразующая IpAddress в строку, например: "127.0.0.1" (IPv4) или "::1" (IPv6);

__concat — функция, присоединяющая IpAddress к строке;

__eq — функция для проверки равенства двух IpAddress;

__band — функция, позволяющая накладывать маску, например: dw.ip('192.168.1.2') & dw.ip('255.255.254.0')

3.Примеры

Вывод в журнал сообщений, сформированных процедурой, запускающейся асинхронно:

local dw = require "drweb"

-- Функция, возвращающая полученную в качестве аргумента строку
-- по истечении двух секунд ожидания
function out_msg(message)
 dw.sleep(2)
 return message
end

-- "Главная" функция
function intercept(ctx)
 -- Вывод строки на уровне NOTICE в журнал Dr.Web для интернет-шлюзов UNIX
 dw.notice("Intercept function started.")

 -- Асинхронный запуск двух экземпляров функции out_msg
 local f1 = dw.async(out_msg, "Hello,")
 local f2 = dw.async(out_msg, " world!")

 -- Ожидание завершения исполнения экземпляров функции
 -- out_msg и вывод их результатов в журнал
 -- Dr.Web для интернет-шлюзов UNIX на уровне DEBUG
 dw.log("debug", f1.wait() .. f2.wait())
end

Создание регулярной процедуы:

local dw = require "drweb"

-- Сохранить таблицу Future в глобальную переменную futurе, чтобы
-- предотвратить ее удаление сборщиком мусора
future = dw.async(function()
   while true do
     -- Каждый день выводит в журнал указанное сообщение
     dw.sleep(60 * 60 * 24)
     dw.notice("A brand new day began")
   end
end)

Преобразование IP-адреса из строки:

local dw = require "drweb"

local ipv4 = dw.ip("127.0.0.1")
local ipv6 = dw.ip("::1")
local mapped = dw.ip("::ffff:127.0.0.1")

 

Содержимое модуля drweb.lookup

1.Функции

Модуль предоставляет функции:

lookup(<запрос>, <параметры>) запрашивает данные во внешнем хранилище, доступном через модуль Dr.Web LookupD. Аргумент <запрос> должен соответствовать секции запроса в настройках Dr.Web LookupD (строка <тип>@<тег>). Необязательный аргумент <параметры> описывает подстановки, которые будут использованы при формировании запроса. Могут быть использованы следующие автоматически разрешаемые маркеры:

$u, $U — заменяется на user — имя пользователя, переданное клиентским компонентом;

$d, $D — заменяется на domain — имя домена, переданное клиентским компонентом.

Аргументы задаются в виде таблицы, ключи и значения которой должны быть строками. Функция возвращает массив строк, являющихся результатами запроса;

check(<проверяемая строка>, <запрос>, <параметры>) возвращает true, если <проверяемая строка> найдена во внешнем хранилище, доступном через модуль Dr.Web LookupD. Аргументы <запрос> и <параметры> полностью аналогичны аргументам функции lookup (см. выше). Аргумент <проверяемая строка> должен быть строкой или таблицей, имеющей метаметод __tostring (т. е. приводимой к строке).

2.Примеры

Вывод в журнал списка пользователей, извлеченного из источника данных LookupD.LDAP.users:

local dw = require "drweb"
local dwl = require "drweb.lookup"

-- "Главная" функция
function intercept(ctx)
 -- Запись строки на уровне NOTICE в журнал Dr.Web для интернет-шлюзов UNIX
 dw.notice("Intercept function started.")

 -- Вывод в журнал Dr.Web для интернет-шлюзов UNIX результатов запроса
 -- к источнику данных 'ldap@users'
 for _, s in ipairs(dwl.lookup("ldap@users", {user="username"})) do
   dw.notice("Result for request to 'ldap@users': " .. s)
 end

end

Содержимое модуля drweb.regex

1. Функции

Модуль предоставляет следующие функции:

search(<шаблон>, <текст>[, <флаги>]) — возвращает true, если строка <текст> содержит подстроку, соответствующую регулярному выражению <шаблон>. Необязательный параметр <флаги> (целое число) — набор флагов, влияющих на поведение функции, объединенных с помощью логического «ИЛИ» (OR).

match(<шаблон>, <текст>[, <флаги>]) — аналогична search за исключением того, что регулярному выражению <шаблон> должна соответствовать вся строка <текст> целиком, а не только ее подстрока.

2. Доступные флаги

ignore_case — игнорировать регистр текста.

3. Примеры

local rx = require "drweb.regex"

rx.search("te.?t", "some TexT") -- false
rx.search("te.?t", "some TexT", rx.ignore_case) -- true

rx.match("some.+", "some TexT") -- true

Содержимое модуля drweb.config

1. Функции

Модуль не предоставляет функций.

2. Доступные таблицы

Модуль предоставляет таблицу, содержащую следующие поля:

Поле

Описание

Тип данных

whitelist

Значение параметра конфигурации Whitelist.

Массив строк

blacklist

Значение параметра конфигурации Blacklist.

Массив строк

adlist

Значение параметра конфигурации Adlist.

Массив строк

block_url_categories

Перечень блокируемых категорий URL (на основе значений параметров Block*, установленных в Yes).

Массив строк

block_threats

Перечень блокируемых категорий угроз (на основе значений параметров Block*, установленных в Yes).

Массив строк

block_unchecked

Значение параметра конфигурации BlockUnchecked.

Логический

Переопределенные метаметоды: Нет

3. Пример

local cfg = require "drweb.config"

function message_hook(ctx)

  -- Блокировать сообщения, содержащие угрозы
  -- из перечня угроз, подлежащих блокированию
  if ctx.body.has_threat{category = cfg.block_threats} then
  return "block"
  end

  -- Разрешить доступ ко всем прочим ресурсам
  return "pass"

end