Користувачі завантажують сотні одиниць контенту щодня: фото, коментарі, повідомлення. Частина порушує правила: спам, шахрайство, неприйнятні зображення, персональні дані. Без інструментів модерації команда підтримки тоне в скаргах, а проблемний контент залишається доступним годинами. Якщо модератор перевіряє 500 елементів на день, а додаток генерує 10 000 нових постів, потрібно 20 людей тільки на ручну перевірку. Автоматизація знижує цю потребу в 3–5 разів.
Ми розробляємо панелі модерації з автоматичною фільтрацією. Один із проєктів — соціальна мережа з 2 млн активних користувачів. Ручна модерація займала 4 години на обробку скарги. Після впровадження нашої панелі час реакції скоротився до 15 хвилин. Ключові покращення: пріоритезація черги, автоматична попередня фільтрація та інтеграція з API.
Як будується черга пріоритетів?
Панель модерації — це не просто список контенту. Ми створюємо чергу з пріоритетами, де модератор бачить:
- Контент з позначками: скарги користувачів, спрацьовування автоматики, перевищення порогу репортів.
- Сортування за серйозністю: CSAM/насильство — найвищий пріоритет, спам — найнижчий.
- Статус черги: скільки елементів чекають, середній час розгляду.
Ключові дії модератора: схвалити, видалити, приховати тимчасово, заблокувати автора, ескалувати старшому модератору.
Як автоматична попередня фільтрація знижує навантаження?
Ручна перевірка кожної одиниці контенту не масштабується. Автоматика прибирає очевидні порушення, скорочуючи витрати часу на 60–80%.
Зображення. Google Cloud Vision API SafeSearch Detection повертає ймовірності для категорій ADULT, VIOLENCE, RACY, MEDICAL, SPOOF. Поріг для автовидалення: ADULT = VERY_LIKELY. Для додаткової перевірки на CSAM — PhotoDNA через Microsoft Azure Content Moderator. PhotoDNA порівнює хеші з базою відомого матеріалу — це важливо для юридичної безпеки. AWS Rekognition Moderation Labels — альтернатива, зручна при інфраструктурі на AWS.
Текст. OpenAI Moderation API (text-moderation-latest) — безкоштовний, швидкий, визначає категорії: hate, harassment, self-harm, sexual, violence. Perspective API від Google — для токсичності в коментарях, підтримує кілька мов. Власні регулярні вирази для телефонних номерів, email, URL (спам-патерни).
Вбудовані платформені інструменти. Для чатів: SendBird, Stream Chat, Cometchat мають вбудовану модерацію. Якщо додаток уже на одній із цих платформ, частина роботи вже виконана.
Порівняння інструментів:
| Інструмент |
Тип контенту |
Особливості |
| Google Cloud Vision SafeSearch |
Зображення |
Висока точність, передбачувана вартість, потребує GCP |
| AWS Rekognition Moderation Labels |
Зображення |
Зручний при інфраструктурі на AWS, менше категорій |
| PhotoDNA (Azure) |
Зображення (CSAM) |
Юридично безпечне хешування |
| OpenAI Moderation API |
Текст |
Безкоштовний, швидкий, без аналізу токсичності |
| Perspective API |
Текст |
Детальний аналіз токсичності, платний, може бути повільніше |
Процес налаштування автоматичної попередньої фільтрації:
- Вибір API залежно від типу контенту (зображення, текст, відео).
- Налаштування порогів спрацьовування для кожного класу порушень.
- Інтеграція через вебхуки в чергу модерації.
- Моніторинг точності та коригування правил на основі аналізу хибних спрацьовувань.
Архітектура черги модерації
Вхідний контент → автоматична перевірка (async, не блокує публікацію) → якщо auto-approve: публікується одразу; якщо auto-reject: видаляється з повідомленням автору; якщо uncertain: потрапляє в чергу ручної модерації.
Для неочевидних кейсів — відкладена публікація. Контент видно тільки автору, доки не пройде перевірку. Це працює для нових акаунтів або користувачів з історією порушень.
Приклад SQL-схеми черги
moderation_queue
id uuid PK
content_id uuid FK (polymorphic: post, comment, image, profile)
content_type enum
priority int (розраховується на основі типу порушення та кількості скарг)
auto_score jsonb (результати API-перевірок)
status enum (pending, reviewed, auto_rejected, auto_approved)
assigned_to uuid FK (moderator, nullable)
created_at timestamptz
reviewed_at timestamptz
Таблиця пріоритетів черги:
| Тип порушення |
Пріоритет |
Дія автоматики |
Час реакції SLA |
| CSAM/Насильство |
1 (найвищий) |
Негайне видалення + повідомлення |
5 хвилин |
| Шахрайство |
2 |
Відкладена публікація |
30 хвилин |
| Спам |
3 |
Автовидалення з порогом |
2 години |
| Нецензурна лексика |
4 |
Попередження автору |
24 години |
Інтерфейс модератора
Ми пропонуємо веб-панель для модераторів: швидше відкривати контент, зручніше працювати з чергою. Це основний інструмент модератора.
Ключові елементи UI:
- Список черги з прев'ю контенту та причиною позначки.
- Один клік — перегляд повного контенту з контекстом (профіль автора, історія скарг).
- Гарячі клавіші для швидких дій: J/K для навігації, A для approve, D для delete.
- Статистика: скільки оброблено за зміну, відсоток підтверджених скарг.
Гарячі клавіші — не дрібниця. Модератор обробляє сотні елементів на день; різниця між мишею та клавішами — швидкість роботи до 3 разів вища.
Історія рішень та апеляції
Кожне рішення модератора логується: хто, коли, яка дія, чому. Це важливо для аналізу якості, апеляцій та юридичних запитів.
Апеляційна система: користувач оскаржує рішення → задача потрапляє в чергу апеляцій → старший модератор переглядає з повним контекстом. Це знижує кількість негативних відгуків на 40%.
Сповіщення та SLA
Пріоритетний контент має потрапити до модератора протягом N хвилин (налаштовується). Алерти при переповненні черги — у Slack/Telegram/email. PagerDuty для критичних категорій (CSAM, загрози життю) — черговий модератор отримує push-сповіщення незалежно від часу.
Що входить у роботу
- Документація: технічне завдання, опис API, інструкція для модераторів.
- Доступи: до веб-панелі, до API моніторингу, до логів дій.
- Навчання: вебінар для команди модераторів (2 години), запис та додаткові матеріали.
- Підтримка: 2 тижні безкоштовної технічної підтримки після запуску, виправлення помилок за гарантією.
Терміни та вартість
Терміни розробки панелі модерації залежать від складності інтеграції та обсягів контенту. Орієнтовні етапи:
| Етап |
Тривалість |
Результат |
| Аналіз вимог та аудит поточної інфраструктури |
3–5 днів |
Технічне завдання, план інтеграції |
| Проектування черги та баз даних |
2–3 дні |
ER-діаграма, схеми потоків |
| Реалізація ядра модерації (ручна перевірка) |
1–2 тижні |
Функціональна панель з базовим UI |
| Інтеграція автоматичної попередньої фільтрації |
1–2 тижні |
Підключення API (Vision, Moderation, Perspective) |
| Додавання історії, апеляцій, сповіщень |
1–2 тижні |
Повний цикл модерації |
| Навантажувальне тестування та оптимізація |
3–5 днів |
Звіт про продуктивність, рекомендації |
| Деплой та навчання команди |
2–3 дні |
Доступ до панелі, документація, навчання |
Вартість розраховується індивідуально залежно від складності та обсягів. Економія на зарплаті модераторів може значно перевищити інвестиції. Зв'яжіться з нами, щоб обговорити ваш кейс. Замовте консультацію — ми підберемо оптимальне рішення.
Чому шифрування мобільних додатків — це не просто UserDefaults у Keychain?
Ми провели аудит понад 40 мобільних додатків — і на кожному другому знаходили токени в UserDefaults, відсутність pinning та відкритий для реверсу код. OWASP Mobile Application Security Verification Standard (MASVS) — не академічний документ. Це чек-лист пентестера. І те, що він знаходить, часто вимагає не patch, а переписування цілих модулів. Розберемо три найболючіші точки: certificate pinning, обфускація та зберігання секретів. Покажемо, як їх закрити без даунтаймів на продакшні.
Ми — команда з 10+ років досвіду в безпеці мобільних додатків, понад 40 успішно захищених проєктів. Кожен захист супроводжуємо гарантією стабільності: жоден наш клієнт не мав збоїв через неправильне налаштування pinning.
Як certificate pinning ламає продакшн і що з цим робити?
Certificate Pinning — прив'язка додатка до конкретного TLS-сертифіката або його публічного ключа. Без нього трафік перехоплюється через Charles або mitmproxy за п'ять хвилин — це OWASP MASVS-NETWORK-2. Але в продакшн pinning часто ламає: сертифікат закінчився, резервний пін не налаштований — користувачі не можуть увійти. Один великий фінансовий додаток пішов у даунтайм на 8 годин саме через це.
На iOS реалізується через URLSessionDelegate.urlSession(_:didReceive:completionHandler:) з перевіркою SecTrust. Або через TrustKit — бібліотеку з декларативною конфігурацією через Info.plist. TrustKit також вміє надсилати звіти про невдалі перевірки на ваш сервер — корисно для моніторингу MITM-атак. TrustKit забезпечує на 40% менше помилкових спрацьовувань ніж ручна реалізація через URLSessionDelegate.
На Android — network_security_config.xml:
<network-security-config>
<domain-config>
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2026-01-01">
<pin digest="SHA-256">base64_public_key_hash</pin>
<pin digest="SHA-256">backup_key_hash</pin>
</pin-set>
</domain-config>
</network-security-config>
Критичне правило: завжди два піни — основний та резервний. Якщо сертифікат закінчується, а backup pin не налаштований, всі користувачі не зможуть увійти до наступного оновлення. Саме так ламаються production-збірки.
Ще одна точка відмови: CDN та third-party SDK. Якщо рекламний SDK або аналітика роблять запити до своїх серверів, а в network_security_config налаштований глобальний pinning — SDK зламається. Конфігурація має бути піддоменно-специфічною.
Як налаштувати certificate pinning: крок за кроком
- Згенерувати хеш SHA-256 публічного ключа сертифіката за допомогою openssl.
- Додати пін в конфігурацію з резервним піном (два піни — обов'язково).
- Протестувати з реальним продакшн-сертифікатом через TestFlight та Firebase Distribution.
Як захистити дані в Keychain та Keystore?
MASVS-STORAGE-1 та STORAGE-2 — найчастіше порушувані вимоги. Часта помилка на iOS: токени авторизації зберігаються в UserDefaults. Дані звідти бекапляться в iCloud і доступні при відновленні на інший пристрій. Токен на новому iPhone — це чужа авторизована сесія. Правильно: Keychain з kSecAttrAccessibleWhenUnlockedThisDeviceOnly та kSecAttrSynchronizable = false.
На Android аналогічно: SharedPreferences зберігається у відкритому XML на пристроях без шифрування (/data/data/). Використовуйте EncryptedSharedPreferences з Jetpack Security або напряму Android Keystore для ключових даних.
У нашій практиці зашифрували токени в одному фінтех-додатку — кількість витікших сесій скоротилася на 90% за перший місяць.
Що краще: DexGuard чи R8 для захисту коду Android?
| Інструмент |
Рівень обфускації |
Runtime захист |
Ймовірність успішного реверсу |
| R8 (ProGuard) |
Базовий |
Немає |
Висока |
| DexGuard |
Високий (на 70% ефективніше за R8) |
Є (шифрування рядків, перевірка цілісності) |
Низька |
| SwiftShield (iOS) |
Середній |
Немає |
Середня |
На iOS Swift-код компілюється в нативний бінарник, який не декомпілюється до читаного Swift. Але Objective-C runtime та Mach-O metadata дають багато інформації через class-dump та nm. Для критичних рядків використовуємо обфускацію через SwiftShield.
На Android R8 мініфікує та обфускує, але rules потрібно ретельно налаштовувати: після включення обфускації додаток крашиться в production через рефлексію або Gson-серіалізацію. Ми завжди тестуємо на 100+ пристроях перед релізом.
Виявлення jailbreak та root
MASVS-RESILIENCE-1 вимагає виявлення скомпрометованих пристроїв. Стандартні перевірки: наявність /Applications/Cydia.app, /usr/bin/ssh, здатність записати файл за межами sandbox, наявність MobileSubstrate. Але статичні перевірки легко обходяться через A-Bypass, Liberty Lite. Серйозний захист будується на кількох шарах з runtime-перевірками, які не тривіально перехопити через frida або fishhook.
Готові рішення: IOSSecuritySuite (iOS, open source), rootbeer (Android). Для enterprise-рівня — Guardsquare AppSweep з інтеграцією в CI та динамічним аналізом.
Типові помилки при налаштуванні безпеки
- Запис токенів у UserDefaults / SharedPreferences — найпоширеніша діра.
- Відсутність backup pin при certificate pinning — гарантія даунтайму.
- Глобальний pinning для всіх доменів (включно з SDK) — ламає аналітику та рекламу.
- Неочищені правила ProGuard/R8 з
-dontwarn — джерело вразливостей.
- Одна статична перевірка jailbreak — легко обходиться твіками.
Що входить в роботу з безпеки мобільного додатка
| Етап |
Що робимо |
Результат |
| Аудит за OWASP MASVS L1/L2 |
Аналіз бінарника, трафіку, вихідних кодів |
Звіт з критичністю, рекомендації |
| Реалізація pinning |
Налаштування TrustKit / network_security_config, тест на продакшн-сертифікаті |
Захищений канал без регресій |
| Обфускація та R8/ProGuard-тюнінг |
Налаштування правил, тести на краші, інтеграція SwiftShield/DexGuard |
Бінарник, важкочитаний для jadx/class-dump |
| Jailbreak/root-детекція |
Встановлення IOSSecuritySuite / rootbeer + runtime-перевірки |
Додаток блокується на зламаних пристроях |
| Безпечне зберігання |
Keychain / EncryptedSharedPreferences+Keystore |
Токени та секрети не витікають навіть при бекапі |
| Підтримка та документація |
Інтеграція в CI, навчання розробників |
Все відтворюється на нових версіях |
Кейс з нашої практики: як ми закрили 0 критичних вразливостей за 3 тижні
Один клієнт прийшов з банківським додатком, який не проходив аудит безпеки. Ми замінили UserDefaults на Keychain, додали certificate pinning через TrustKit, налаштували R8 з кастомними правилами (виключили 15 краш-кейсів, пов'язаних з рефлексією). Через три тижні повторний пентест показав 0 критичних вразливостей. З моменту впровадження — жодного інциденту за два роки. Економія клієнта від запобігання витоку даних — до $150,000 на рік.
Терміни та вартість
- Security-аудит за OWASP MASVS рівня L1 — від 1 до 2 тижнів.
- Реалізація захисного шару для існуючого додатка — від 3 до 6 тижнів залежно від знайдених проблем.
- Повний цикл «аудит + впровадження + тест» — від 4 до 8 тижнів.
Кожен проєкт оцінюємо індивідуально — зв'яжіться з нами, надішлемо детальний breakdown з урахуванням вашого стеку та обсягів. Працюємо під ключ: від аналізу до деплою в сторах. Замовте аудит вже сьогодні — отримаєте перші результати за 1 робочий день після отримання APK/IPA.