Ссылку прислал пользователь: как не дать ей увести вашу аудиторию на фишинг
Модератор не успевает открыть каждую ссылку, а автоматика по чёрным спискам из интернета устаревает быстрее, чем обновляется. Разбираем, что реально даёт проверка репутации адреса, чего она не даёт — и почему у вердикта «чисто» обязана быть дата.
Письмо пришло с адреса, похожего на банковский, и вело на страницу, неотличимую от настоящего входа в личный кабинет. Сотрудник ввёл логин и пароль, увидел «сервис временно недоступен, попробуйте позже» и закрыл вкладку. Через сорок минут с корпоративного ящика ушла рассылка всем контрагентам — с тем же письмом и той же ссылкой.
Вторая история дешевле и тише. На доске объявлений пользователь оставил ссылку на «инструкцию в PDF». Файл действительно скачивался, только вместе с установщиком, который менял стартовую страницу браузера и подставлял свою рекламу поверх чужих сайтов. Модератор ссылку видел. Он её даже открыл — и не увидел ничего подозрительного, потому что подмена срабатывала не для всех и не сразу.
Обе площадки считали, что у них есть модерация. У обеих она сводилась к тому, что человек глазами смотрит на адрес и решает, выглядит ли он прилично. Это не модерация, а лотерея: современная фишинговая страница выглядит лучше оригинала, а вредоносная нагрузка показывается выборочно.
Что вообще значит «плохая ссылка»
Под «плохой ссылкой» разные люди понимают разное, и от этого происходит половина разочарований в любых проверках. Разложим на три различимых случая — ровно те, о которых сервис говорит определённо.
| Вид угрозы | Что происходит с посетителем | Типичный носитель |
|---|---|---|
| Вредоносное ПО | Страница пытается доставить на устройство программу: через загрузку файла или через уязвимость браузера | Взломанный сайт-однодневка, «крякнутый» софт, поддельный установщик обновления |
| Фишинг | Страница выдаёт себя за чужую и собирает то, что посетитель на ней вводит: логин, пароль, код из СМС, данные карты | Ссылка из письма «подтвердите вход», сокращённая ссылка в мессенджере, объявление о выплате |
| Нежелательное ПО | Устанавливается что-то сверх обещанного: подмена стартовой страницы и поиска, свои баннеры поверх чужих сайтов, «оптимизаторы» с подпиской | Сайты-агрегаторы загрузок, «скачать бесплатно без регистрации», партнёрские установщики |
Чего в этом списке нет — и не будет. Сервис не оценивает, честный ли перед вами магазин, придёт ли оплаченный товар и не завышена ли цена. Он не судит о качестве контента и не занимается репутацией бизнеса. Это проверка технической угрозы, а не рейтинг добросовестности.
Где это действительно нужно
Проверка ссылки полезна не везде. Она даёт отдачу там, где адрес приходит извне и попадает к другому человеку — то есть там, где вы отвечаете за чужой клик.
Пользовательский контент со ссылками
- Что происходит
- Комментарии, объявления, профили, отзывы, чаты поддержки. Ссылку оставляет кто угодно, а видит её вся аудитория площадки.
- Во что обходится
- Одна фишинговая ссылка в популярной ветке обходится дороже месяца работы модерации: увод аккаунтов, жалобы, а следом — предупреждение браузера уже на ВАШЕМ домене, потому что он раздаёт ссылку на угрозу.
- Чем закрывается
- Проверка на этапе публикации. Адрес отправляется на проверку до того, как запись станет видимой; при вердикте «угроза» запись уходит на ручной разбор, а не в ленту.
Входящая почта и заявки
- Что происходит
- Менеджеры и бухгалтерия открывают ссылки из писем, потому что это их работа: счёт, накладная, «подтвердите реквизиты».
- Во что обходится
- Уведённый корпоративный ящик рассылает то же письмо контрагентам от вашего имени. Ущерб множится по адресной книге, а разбираться приходится с каждым получателем отдельно.
- Чем закрывается
- Прогон ссылок из входящих писем перед доставкой: пометка в теле письма или карантин. Проверка идёт по адресу и не требует открывать вложение или страницу.
Партнёрские и рекламные ссылки
- Что происходит
- В сеть заводят креативы с внешними адресами. Ссылка на модерации ведёт на нормальный лендинг, а через неделю подменяется редиректом.
- Во что обходится
- Площадка платит репутацией: жалобы приходят на неё, а не на партнёра. Ручная перепроверка всего каталога — работа, которую никто не делает регулярно.
- Чем закрывается
- Периодический прогон всей базы активных ссылок пакетом. Сто адресов за вызов, поэтому даже десятки тысяч ссылок — вопрос нескольких минут, а не отдельного проекта.
Ссылки внутри документов и выгрузок
- Что происходит
- Каталог поставщиков, справочник контактов, база вакансий: у каждой записи есть сайт, заведённый когда-то и с тех пор не проверявшийся.
- Во что обходится
- Домен освободился и был перекуплен. По ссылке из вашего уважаемого справочника посетитель попадает уже не туда, куда шёл, — и виноват в этом справочник.
- Чем закрывается
- Разовая ревизия пакетом плюс проверка при каждом добавлении новой записи. Это две строки в форме сохранения, а не отдельная подсистема.
Как читать вердикт (самое важное)
Ответ состоит из вердикта и списка видов угрозы, если угроза найдена. Вердиктов три, и каждый значит меньше, чем кажется на первый взгляд.
| Вердикт | Что он утверждает | Чего он НЕ утверждает |
|---|---|---|
clean |
На момент проверки записи об угрозе по этому адресу нет | Что сайт безопасен, что ему можно доверять, что завтра он останется чистым |
threat |
Угроза числится, и её вид указан в ответе | Что угроза активна прямо сейчас: владелец мог вычистить сайт час назад |
unknown |
Проверить не удалось — источник не ответил | Ни того, ни другого. Это отсутствие ответа, а не мягкое «наверное, нормально» |
Отдельно про unknown. Соблазн приравнять его к «чисто» велик: так проще
писать код и так ничего не ломается. Но это ровно та подмена, из-за которой сбой источника
превращается в открытую дверь. Правильная обработка — либо повторить проверку позже, либо
отправить запись на ручной разбор. Ни то ни другое не стоит денег: unknown
не тарифицируется.
Код: одна ссылка и пакет
Одиночная проверка — обычный GET с адресом в параметре. Пакетная принимает массив строк телом запроса: повторы в списке считаются один раз, и платить за них дважды не придётся.
# Один адрес
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
"https://atlorium.com/api/urlcheck?url=https://example.com/promo"
# Пакет: до 100 адресов телом запроса
curl -X POST \
-H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
-H "Content-Type: application/json" \
-d '["https://example.com","http://malware.example.com/x","https://phishing.example.com/login"]' \
"https://atlorium.com/api/urlcheck/batch"
import requests
BASE = "https://atlorium.com"
HEADERS = {"Authorization": "Bearer ak_sandbox_demo_mockdata_v1"}
def is_publishable(url: str) -> bool:
"""Пропускать запись в ленту или отправить на ручной разбор.
Ключевой момент — обработка unknown. Соблазн вернуть True («источник
не ответил, ну и ладно») превращает сбой проверки в открытую дверь,
поэтому неизвестный вердикт уходит модератору наравне с угрозой.
"""
r = requests.get(f"{BASE}/api/urlcheck", params={"url": url}, headers=HEADERS, timeout=20)
if r.status_code != 200:
return False # не проверили — не публикуем
data = r.json()
return data["verdict"] == "clean"
# Пакетный режим: ревизия всей базы ссылок кусками по сто
def check_batch(urls: list[str]) -> dict[str, str]:
verdicts: dict[str, str] = {}
for i in range(0, len(urls), 100):
chunk = urls[i:i + 100]
r = requests.post(f"{BASE}/api/urlcheck/batch", json=chunk, headers=HEADERS, timeout=60)
r.raise_for_status()
for item in r.json()["results"]:
verdicts[item["url"]] = item["verdict"]
return verdicts
using System.Net.Http.Json;
HttpClient http = new() { BaseAddress = new Uri("https://atlorium.com") };
http.DefaultRequestHeaders.Add("Authorization", "Bearer ak_sandbox_demo_mockdata_v1");
// Одиночная проверка перед публикацией комментария.
UrlThreatResult? single = await http.GetFromJsonAsync<UrlThreatResult>(
$"/api/urlcheck?url={Uri.EscapeDataString(url)}");
// Публикуем ТОЛЬКО при явном «чисто»: unknown означает «не проверили»,
// и приравнивать его к разрешению — значит сделать сбой источника лазейкой.
bool publish = single?.Verdict == "clean";
// Пакет: ревизия каталога партнёрских ссылок.
HttpResponseMessage response = await http.PostAsJsonAsync("/api/urlcheck/batch", urls);
UrlThreatBatch? batch = await response.Content.ReadFromJsonAsync<UrlThreatBatch>();
record UrlThreatResult(string Url, string Verdict, string[] ThreatTypes, DateTime CheckedAtUtc);
record UrlThreatBatch(UrlThreatResult[] Results, int Total, int ThreatCount, int UnknownCount);
const BASE = "https://atlorium.com";
const HEADERS = { Authorization: "Bearer ak_sandbox_demo_mockdata_v1" };
async function checkUrl(url) {
const r = await fetch(`${BASE}/api/urlcheck?url=${encodeURIComponent(url)}`, { headers: HEADERS });
if (!r.ok) return { verdict: "unknown" };
return r.json();
}
async function checkBatch(urls) {
const r = await fetch(`${BASE}/api/urlcheck/batch`, {
method: "POST",
headers: { ...HEADERS, "Content-Type": "application/json" },
body: JSON.stringify(urls.slice(0, 100)),
});
const data = await r.json();
// Ссылки, из-за которых стоит будить модератора.
return data.results.filter((x) => x.verdict !== "clean");
}
{
"url": "http://malware.example.com/x",
"verdict": "threat",
"threatTypes": ["malware"],
"checkedAtUtc": "2026-09-01T09:14:22Z",
"message": "",
"elapsedMs": 184
}
Тот же вызов на шести языках (Python, TypeScript, Go, Java, C#, PHP) — в репозитории url-threat-check-api-client. Примеры запускаются сразу: ключ в них уже стоит демонстрационный.
Как встроить, чтобы не сломать себе площадку
Проверка ссылки — быстрая операция, но она всё-таки сетевая, и от того, куда её поставить, зависит, поможет она или начнёт мешать.
Проверяйте на публикации, а не на каждом показе. Ссылка в комментарии проверяется один раз при сохранении, а не при каждой отрисовке страницы. Иначе популярная ветка превращается в поток одинаковых запросов, а время ответа страницы начинает зависеть от внешнего сервиса.
Перепроверяйте по расписанию, а не по клику. Ссылка, чистая в момент публикации, может испортиться позже — именно так работает подмена в партнёрских сетях. Ночной прогон активных ссылок пакетом закрывает этот сценарий, ничего не замедляя днём.
Считайте вердикт сигналом, а не приговором. Автоматическое удаление по вердикту
threat звучит логично ровно до первого ложного срабатывания на ссылке
крупного партнёра. Разумнее: скрыть из ленты, поставить в очередь на разбор, уведомить
автора. Решение принимает человек, а сервис экономит ему время на просмотре тысяч
нормальных ссылок.
Разворачивайте сокращатели заранее. Проверяется тот адрес, который вы прислали. Если это короткая ссылка сервиса сокращения, вердикт будет про неё, а не про конечную страницу. Разверните её у себя и проверьте конечный адрес — или проверьте оба.
Границы: чего проверка не делает
Не заменяет антивирус. Проверка говорит о репутации адреса, а не о том, что происходит на устройстве. Файл, скачанный по чистой ссылке, всё равно проверяет антивирус — это разные рубежи, и один не отменяет другой.
Не оценивает добросовестность бизнеса. Интернет-магазин, который берёт предоплату и не отправляет товар, технической угрозы не несёт: он не раздаёт вирусы и не подделывает чужой сайт. Вердикт по нему будет «чисто», и это правильный ответ на заданный вопрос. Вопрос про добросовестность — к проверке контрагента по ЕГРЮЛ, а не сюда.
Не проверяет сертификат. Просрочка сертификата, самоподписанный сертификат, несовпадение домена — отдельная тема, и для неё есть отдельный сервис. Здесь адрес с битым сертификатом получит «чисто», если за ним не числится угрозы.
Не гарантирует полноту. Ни одна база угроз не знает обо всех вредоносных страницах мира — особенно о поднятых час назад. Проверка резко сокращает поток очевидно плохих ссылок и не отменяет остальных мер: обучения сотрудников, двухфакторной аутентификации, подтверждения платежей.
Частые вопросы
Частые вопросы
Как проверить ссылку на вирусы, не открывая её?
Отправьте адрес на проверку — сервис вернёт вердикт, не загружая страницу. Ни скрипты, ни загрузки при этом не выполняются, и до вашего браузера содержимое страницы не доходит. Именно этим проверка отличается от привычки «сейчас открою и посмотрю»: открывая подозрительный адрес вручную, вы рискуете ровно тем, от чего пытаетесь защититься.
Что значит вердикт «чисто» — сайту можно доверять?
Нет. «Чисто» означает ровно одно: на момент проверки записи об угрозе по этому адресу нет. Сайт могли взломать час назад, а свежая фишинговая страница попадает в базы не мгновенно. Поэтому в ответе всегда есть отметка времени, и читать вердикт нужно вместе с ней. Утверждения «сайт безопасен» проверка репутации не делает и делать не может.
Проверяется страница или адрес?
Адрес. Сервис сверяет его с базой репутации и не анализирует содержимое страницы. Из этого следует практическое ограничение: если вы прислали короткую ссылку сервиса сокращения, вердикт будет про неё, а не про конечную страницу. Разверните её на своей стороне и проверьте конечный адрес.
Чем это отличается от проверки SSL-сертификата?
Это ответы на разные вопросы. Сертификат говорит, что соединение зашифровано и выдано на этот домен, — фишинговый сайт получает бесплатный сертификат за минуту и выглядит в браузере абсолютно «безопасно». Проверка репутации говорит, числится ли за адресом угроза. Замок в адресной строке не является заменой этой проверки.
Что делать с вердиктом unknown?
Считать его отсутствием ответа, а не мягким разрешением. Повторите проверку позже или отправьте запись на ручной разбор. Приравнивание unknown к «чисто» — самая частая ошибка встраивания: она превращает временный сбой источника в открытую дверь. Такие строки не тарифицируются, поэтому повтор ничего не стоит.
Сколько ссылок можно проверить за один запрос?
До ста. Повторяющиеся адреса в списке считаются один раз, а строки, по которым вердикт получить не удалось, из счёта исключаются: списывается число реально проверенных адресов, а не число присланных строк. Для ревизии большого каталога режьте список на куски по сто.
Как часто перепроверять уже проверенные ссылки?
Зависит от того, что вы защищаете. Для пользовательского контента разумен ночной прогон активных ссылок: подмена целевой страницы через неделю после модерации — рабочая схема, и однократная проверка при публикации её не ловит. Для входящей почты перепроверять нечего: письмо разбирается один раз.
Сервисы из этой статьи
Репутация URL до перехода: фишинг, вредонос, нежелательное ПО. Пакетный режим для модерации ссылок. Сбои проверки не тарифицируются
Срок действия, цепочка доверия и параметры TLS-сертификата домена
Попробовать прямо сейчас — без регистрации
Демо-ключ ak_sandbox_demo_mockdata_v1 — публичный и общий для всех.
С ним API отвечает моками: данные правдоподобные, но сгенерированные,
и они не меняются от запроса к запросу — на них удобно писать тесты.
Настоящие данные приходят с личным ключом.
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
https://atlorium.com/openapi/url_ru.json