SDK API категоризации доменов
Общие положения
Данная библиотека позволяет клиентам компании SkyDNS решать следующие основные задачи:
- Находить категории заданного URL с помощью поиска в локальной базе данных, находящейся на конечном устройстве пользователя (ПК, маршрутизатор, встраиваемое устройство). В этом случае подключение к сети Интернет не нужно и никаких сетевых запросов не выполняется. Эта база данных называется локальной базой данных.
- Находить категории заданного URL с помощью обращения по протоколу HTTPS к облаку компании SkyDNS. Поскольку в этом случае выполняется сетевой HTTPS-запрос, то для реализации этого функционала требуется, во-первых, работоспособное подключение к сети Интернет, и, во-вторых, наличие логина и пароля к соответствующему сервису SkyDNS. Но в этом случае наличие на компьютере пользователя локальной опорной базы данных не нужно.
- Сохранять в локальном дисковом кэше категории URL, полученные из облака SkyDNS для последующего более быстрого доступа к ним. Данные, сохранённые в дисковом кэше, переживают перезагрузку компьютера и перезапуск приложения, использующего этот кэш.
- Кэшировать в оперативной памяти компьютера полученные категории данного URL для ускорения последующего их поиска. Размеры кэша задаются при сборке решения.
- Получать с сайта SkyDNS и устанавливать регулярные обновления к локальной базе данных тематических категорий сайтов. На текущий момент доступно только скачивание полностью базы данных (все категории ~1.6Гб, возможны более мелкие кастомные сборки)
Решение реализовано на языке программирования Си и предоставляет своим пользователям интерфейс в виде функций на этом языке программирования. Решение может быть также интегрировано в проект на языке Python (имеются примеры интеграции в Си и Python решения).
На текущий момент существует возможность выдачи категорий на английском и русских языках (задаётся на этапе компиляции библиотеки).
Интеграция SDK в конечный продукт
SDK достаточно просто интегрировать в конечный программный продукт, разрабатываемый на языке программирования Си или Си++. Также существует возможность интегрировать его в конечное решение на Python.
Для использования библиотеки необходимо получить исходники библиотеки (тут репозиторий), сконфигурировать библиотеку, собрать и установить.
Конфигурирование библиотеки url2cat
Для конфигурирования и сборки библиотеки используется утилита cmake (версии 3.15 или выше).
Также понадобятся библиотеки (для Ubuntu 18+): openssl-1.1.1, sqlite3.
- Зайдите в каталог с исходниками библиотеки
- Сконфигурируйте библиотеку используя команду:
cmake -S . -B build_release -DCMAKE_BUILD_TYPE=Release > -DURL2CAT_SERVER=yes -DURL2CAT_DATABASE=yes -DURL2CAT_LOCALE=ru > -DURL2CAT_LIBRARY=static
Изменяя следующие переменные можно настроить функции библиотеки:
URL2CAT_SERVER
- запросы к серверу SkyDNS (yes, no);URL2CAT_DATABASE
- запросы к локальной БД (yes , no);URL2CAT_LOCALE
- формат отображения категорий (ru, en);URL2CAT_LIBRARY
- тип создаваемой библиотеки (static, shared);URL2CAT_MAX_NUMBER_CATEGORY
- количество определяемых категорий (по умолчанию 5);URL2CAT_HASH_TYPE
- тип хэша (MD5, SHA256, SHA512, по умолчанию MD5);URL2CAT_HASH_LEN
- используемая длина хэша (full (хэш не обрезается перед поиском по базе), half (берётся 8 первых Байт хэша), по умолчанию half).
- Соберите библиотеку используя команду:
cmake --build build_release
- Скопируйте следующие файлы библиотеки в свой проект:
build_release/lib/liburl2cat.a
илиbuild_release/lib/liburl2cat.so
;include/url2cat.h
.
Использование библиотеки в проекте
Вначале использования библиотеки нужно ее инициализировать с использованием структуры s_url2cat_setting
. Структура имеет следующие поля:
cache_size
- размер кэша в байтах (если установлен 0 кэш не используется);db_name
- имя базы данных;db_download_scheme
- протокол для обновления БД;db_download_host
- хост обновления БД;db_download_port
- порт обновления БД;db_download_path
- путь обновления БД;db_download_user
- логин для обновления БД;db_download_password
- пароль для обновления БД;server_scheme
- протокол подключения к серверу SkyDNS;server_host
- хост подключения к серверу SkyDNS;server_port
- порт подключения к серверу SkyDNS;server_path
- путь подключения к серверу SkyDNS;server_user
- логин подключения к серверу SkyDNS;server_password
- пароль подключения к серверу SkyDNS.
Для инициализации используется функция : url2cat_init(s_url2cat_setting * setting)
Для получения категории используется функция: url2cat_category(char * url, size_t len_url, s_url2cat_category * * category, size_t * number_category)
где s_url2cat_category
структура, имеющая следующие поля:
type
- номер категории;type_name
- название категории.
После использования библиотеки нужно ее деинициализировать используя функцию: url2cat_deinit()
При использовании библиотеки можно обновить БД используя функцию: url2cat_database_update(s_url2cat_setting * setting)
При использовании библиотеки можно отправить домен на перекатегоризацию используя функцию: url2cat_recategory(char * url, size_t url_size, char * category_name, size_t category_name_size)
Примечание. В каталоге example/
исходников библиотеки url2cat есть примеры интеграции в простые решения на Си и Python.
Приложения
Приложение 1. Справочник категорий
В настоящее время поддерживаются такие категории:
id |
Категория |
2 |
Неизвестные сайты |
3 |
Malware |
4 |
Phishing & Typosquatting |
5 |
Онлайн-реклама и баннеры |
6 |
Наркотики |
7 |
Грубость, матершина, непристойность |
8 |
Плагиат и рефераты |
9 |
Запаркованные домены |
10 |
Агрессия, расизм, терроризм |
11 |
Прокси и анонимайзеры |
12 |
Botnets & C2C |
13 |
Сайты для взрослых |
14 |
Алкоголь и табак |
15 |
Знакомства |
16 |
Порнография и секс |
17 |
Астрология |
18 |
Казино, лотереи, тотализаторы |
20 |
Торренты и P2P-сети |
21 |
Файловые архивы |
22 |
Фильмы и видео онлайн |
23 |
Радио и музыка онлайн |
24 |
Фотогалереи |
25 |
Content Delivery Networks |
26 |
Чаты и мессенджеры |
27 |
Форумы |
28 |
Компьютерные игры |
29 |
Социальные сети |
30 |
Досуг и развлечения |
32 |
Автомобили и транспорт |
33 |
Блоги и персональные сайты |
34 |
Корпоративные сайты |
35 |
Интернет-магазины |
36 |
Образование и учебные учреждения |
37 |
Финансы и финансовые учреждения |
38 |
Правительство |
39 |
Здоровье и здравоохранение |
40 |
Юмор |
41 |
Работа и найм |
42 |
Войска и вооружения |
43 |
Политика, общество, закон |
44 |
Новости и СМИ |
45 |
Некоммерческие организации |
46 |
Порталы |
47 |
Религия и атеизм |
48 |
Поисковые системы |
49 |
Компьютеры и Интернет |
50 |
Спорт |
51 |
Наука и технологии |
52 |
Туризм |
53 |
Дом, семья, хобби |
54 |
Торговля и покупки |
55 |
Искусство |
56 |
Веб-почта |
57 |
Недвижимость |
58 |
Доски объявлений |
59 |
Бизнес, экономика, маркетинг |
60 |
Сайты для детей |
63 |
Трекинг и Аналитика |
66 |
Сryptojacking |
67 |
Интернет-библиотеки |
69 |
Аниме |
70 |
DGA |
71 |
Ransomware |
72 |
ИИ Чат-боты |
100 |
Без контента |
Для зарубежного рынка добавлены категории:
id |
Категория |
19 |
Child Sexual Abuse (IWF) |
31 |
German Youth Protection |
65 |
Child Sexual Abuse (Arachnid) |
Приложение 2. Канонический вид домена (или URL’а)
Один URL может быть представлен не в одной уникальной форме, для представления одного ресурса, например, punny-код и кириллица в домене, висячий слеш, и т.д.
Было бы нерационально включать в базу категоризации все эти различные возможности, как минимум для некоторых интеграций базы, например, в небольшие бюджетные роутеры.
Потому, наиболее рациональной кажется схема, по которой URL’ы ресурсов в базе хранятся в каноническом виде, а значит, перед запросом списка категорий, URL требуется каноникализировать, то есть получить каноническое представление URL’а.
Единый указатель ресурса URL состоит из нескольких частей, но нас интересует только два из них:
- Доменное имя (
domain
); - Путь (
path
).
Рассмотрим на примере случайного URL:
directory.google.com/example/test.php?key=value&one=1
где домен это:
directory.google.com
а это путь URL:
/example/test.php?key=value&one=1
Поскольку URL указывает на ресурс, он может быть записан в различных формах и различными способами. Для прямого поиска в базе надо привести все разнообразные формы URL указывающие на один ресурс к одному каноничному виду. Это очень важно для получения правильной категоризации запрашиваемого URL.
Мы используем стандартный вариант каноникализации URL из проекта Google Safe Browsing с версией API больше 2. В этом проекте описаны техники для каноникализации идентификатора ресурса, с примерами и алгоритмами которого можно ознакомится на странице.
Примеры каноникализации:
Исходный URL |
Каноничный URL |
|
|
|
|
|
|
|
|
Каноникализация в контексте библиотеки url2cat
Описанным выше образом мы получим каноничную форму URL. Но из-за природы URL нельзя положиться на один URL. Для поиска наилучшего соответствия ему в базе требуется сформировать производные URL, путем поочередного отбрасывания частей первичного URL с левого и правого края.
Рассмотрим на примере случайного URL:
directory.google.com/example/test.php?key=value&one=1
Производные URL будут следующими:
directory.google.com/example/test.php
directory.google.com/example/
directory.google.com/
google.com/example/test.php?key=value&one=1
google.com/example/test.php
google.com/example/
google.com/
Получившиеся URL требуется проверить по базе.
Приложение 3. Локальная база
Один из способов получения категорий URL состоит в использовании локальной базы данных, которую предоставляет своим клиентам компания SkyDNS. Эта база данных ежедневно обновляется и потому всегда содержит актуальную информацию о сайтах сети Интернет. В настоящее время эта база данных поставляется в формате sqlite3.
Обновление базы
База распространяется в двух видах: файл-бинарник (sqlite3-база) и патч (набор sql-конструкций для приведения имеющейся sqlite3-базы в актуальное состояние).
Источник для получения базы в бинарном виде: https://url2cat.skydns.ru/pubfilter/grandbase.db
.
Источник для получения базы в виде патчей: https://url2cat.skydns.ru/api/v1/update/<user_version>
, где <user_version> это PRAGMA параметр текущей базы. Внутри получаемого патча, первой строкой указывается новая версия этого параметра и если она совпадает с запрошенной, то обновления не требуется.
Посмотреть текущую версию базы (PRAGMA-параметр user_version) можно командой (Linux):
xxd -l 4 -s 60 grandbase.db
Процесс обновления представляет из себя GET-запрос к указанному источнику с параметрами BASIC-авторизации.
Описание базы
Таблица result
Таблица «result» содержит хешированные записи URL и их категоризацию.
Схема базы данных:
Название |
Данные |
domain_hash |
хэш от домена |
path_hash |
хэш от пути |
cat_id |
список категорий |
С первичным ключом по полям domain_hash
, path_hash
.
Данные в поле cat_id
хранятся в виде blob массива, для стандартизации перечисляемого типа, где каждая категория хранится в виде unsigned short.
Таблица cat
Таблица «cat» содержит список записей с названиями и идентификаторами категорий. В зависимости от требований клиента база SkyDNS Octo может поставляться с различным числом категорий с более детальной категоризацией или уникальными именами категорий.
Схема базы данных:
Название |
Данные |
locale |
идентификатор локализации |
cat_id |
идентификатор категории |
name |
название категории |
C первичным составным ключом locale
, cat_id
.
Идентификаторы из поля cat_id
таблицы «result» являются внешним ключом на эту таблицу. Поле locale
содержит идентификатор локализации языка, на котором записано название категории в поле name
. Поле cat_id
содержит числовой идентификатор категории, данные cat_id
не являются последовательными. Поле name
содержит локализованные названия категорий.
Присутствие в таблице записей на английском языке в любой локализации не считается ошибкой, а указывают на переведенные категории.
Приложение 4. API категоризации
Другой способ получения категорий URL состоит в использовании API категоризации. Получение списка категорий осуществляется GET-запросом на URL одного из серверов авторизации с применением BASIC-авторизации.
Сервера API категоризации
SkyDNS:
https://z.api.skydns.ru/
- анонимный бесплатный сервер
https://x.api.skydns.ru/
- сервер с авторизацией
На бесплатных серверах ограничение в 10 запросов в минуту.
Запрос на категоризацию
Формат запроса, на примере бесплатного сервера SkyDNS:
https://z.api.skydns.ru/domain/pornhub.com
Ответом сервера будет json вида:
{ "category": [13, 16, 64], "bad": true, "category_name": [ "Сайты для взрослых", "Порнография и секс", "Реестр запрещенных сайтов" ] }