
Заманивайте AI-веб-скраперы в бесконечную ядовитую яму.
# 🌀 Miasma
[](#)
[](https://crates.io/crates/miasma)
[](https://crates.io/crates/miasma)
[](https://hub.docker.com/r/austinweeks/miasma)
[](#)
<picture>
<img src="https://assets.kitploit.com/production/public/readmes/12808/53ea9eddbca68d25cbf4085762448c1cc10ee6fdf38bda837c6abf665a9d673f.png" alt="Веб-краулеры застревают в облаке ядовитого миазма." title="Cover art by @cerberussaturn07" />
</picture>
AI-компании непрерывно скребут интернет в огромных масштабах, поглощая всё его содержимое для использования в качестве обучающих данных для своих следующих моделей. Если у вас есть публичный сайт, _они уже воруют вашу работу._
_Miasma_ здесь, чтобы помочь вам дать отпор! Запустите сервер и направьте на него любой вредоносный трафик. _Miasma_ будет отправлять отравленные обучающие данные из [poison fountain](https://rnsaffn.com/poison3) вместе с множеством самореферентных ссылок. Это бесконечный шведский стол из мусора для мусорных машин.
_Miasma_ молниеносно быстра и имеет минимальный объём памяти — вам не нужно тратить вычислительные ресурсы на отражение интернет-паразитов.
> [!CAUTION]
> Развёртывание этого программного обеспечения сопряжено с неотъемлемым риском. Пожалуйста, полностью прочитайте [конфигурацию](#configuration) и [отказ от ответственности](#disclaimer) перед использованием.
## Использование
Вы можете запустить _Miasma_ локально или с официальным [docker-образом](https://hub.docker.com/r/austinweeks/miasma).
Если вы хотите интегрировать _Miasma_ в существующий Rust-сервер, вы также можете [использовать _Miasma_ как библиотеку](https://docs.rs/miasma/).
### Локальный запуск
Установите с помощью [cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html) (рекомендуется):
```sh
cargo install miasma
```
Либо скачайте готовый бинарник из [releases](https://github.com/austin-weeks/miasma/releases).
Также доступны пакеты, поддерживаемые сообществом, для различных менеджеров пакетов:
<a href="https://repology.org/project/miasma/versions">
<img
src="https://repology.org/badge/vertical-allrepos/miasma.svg?exclude_unsupported=1&minversion=0.2"
alt="Packaging status"
>
</a>
<br>
<br>
Запустите _Miasma_ с конфигурацией по умолчанию:
```sh
miasma
```
Просмотрите все доступные [параметры конфигурации](#configuration):
```sh
miasma --help
```
### Запуск с Docker
Запустите _Miasma_ с помощью официального [docker-образа](https://hub.docker.com/r/austinweeks/miasma):
```sh
docker run --rm -p 9999:9999 austinweeks/miasma:latest
```
Передайте те же [флаги конфигурации](#configuration), которые вы использовали бы локально:
```sh
docker run --rm -p 9999:9999 austinweeks/miasma:latest \
--link-prefix '/naughty-bots' \
--max-in-flight 30
```
Или запустите в кластере docker compose:
```yaml
services:
miasma:
image: austinweeks/miasma:latest
command: ["--link-prefix", "/naughty-bots", "--max-in-flight", "30"]
ports:
- 9999:9999
```
## Как ловить скраперов
Давайте рассмотрим пример настройки сервера для отлова скраперов с помощью _Miasma_. Мы выберем `/naughty-bots` в качестве пути нашего сервера для направления трафика скраперов. Мы будем использовать [_Nginx_](https://nginx.org/) в качестве обратного прокси нашего сервера, но того же результата можно добиться и с множеством других конфигураций.
Когда мы закончим, скраперы будут пойманы следующим образом:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/austin-weeks/miasma/main/.github/images/flow-chart-dark.png">
<img height="425" src="https://assets.kitploit.com/production/public/readmes/12808/0fc56b18661aceabe968dff1a03545577f5a28691a3a4d20e096093919935ceb.png" alt="Блок-схема, изображающая цикл пойманных скраперов.">
</picture>
</p>
### Встраивание скрытых ссылок
Внутри нашего сайта мы разместим несколько скрытых ссылок, ведущих на `/naughty-bots`.
```html
<a
href="https://github.com/austin-weeks/miasma/blob/main/naughty-bots"
style="display: none;"
aria-hidden="true"
tabindex="-1"
>
Amazing high quality data here!
</a>
```
Атрибуты `style="display: none;"`, `aria-hidden="true"` и `tabindex="-1"` гарантируют, что ссылки полностью невидимы для людей-посетителей и будут игнорироваться программами чтения с экрана и навигацией с клавиатуры. Они будут видны **только** скраперам.
### Настройка нашего Nginx-прокси
Поскольку наши скрытые ссылки указывают на `/naughty-bots/`, мы настроим этот путь для проксирования запросов в _Miasma_. Предположим, что мы запускаем _Miasma_ на порту `9855`.
Мы также настроим агрессивное ограничение скорости на основе user agent скрапера, чтобы помочь гарантировать, что мы случайно не устроим DDoS сами себе.
```nginx
http {
# Reserve 8MB memory for tracking user agents
limit_req_zone $http_user_agent zone=miasma:8m rate=1r/s;
server {
location = /naughty-bots {
port_in_redirect off;
return 301 /naughty-bots/;
}
location /naughty-bots/ {
# Rate limit via the 'miasma' zone with no queueing
limit_req_status 429;
limit_req zone=miasma burst=5 nodelay;
# Proxy requests to Miasma
proxy_pass http://localhost:9855/;
}
}
}
```
Эта конфигурация перехватит все варианты пути `/naughty-bots` -> `/naughty-bots`, `/naughty-bots/`, `/naughty-bots/12345` и т. д.
### Запуск _Miasma_
Наконец, мы запустим _Miasma_ и укажем `/naughty-bots` в качестве префикса ссылок. Это указывает _Miasma_ начинать ссылки с `/naughty-bots/`, что гарантирует правильную маршрутизацию скраперов через наш _Nginx_-прокси обратно в _Miasma_.
Давайте ограничим максимальное количество одновременных соединений до 50. При 50 соединениях мы можем ожидать пиковое потребление памяти 50-60 МБ. Обратите внимание, что любые запросы, превышающие этот лимит, немедленно получат ответ **429**, а не будут добавлены в очередь.
Мы также заставим _Miasma_ сжимать все ответы с помощью gzip независимо от заголовка `Accept-Encoding` скраперов. Поскольку gzip-сжатые ответы значительно меньше, это поможет нам сократить расходы на исходящий трафик.
Хотя мы могли бы держать скраперов в ловушке вечно, мы используем параметры количества ссылок и максимальной глубины, чтобы отпустить скраперов после того, как они поглотят ~100 тыс. отравленных страниц. С такой настройкой _Miasma_ отправит около **250 МБ** общих данных на каждого скрапера.
```sh
miasma --link-prefix '/naughty-bots' -p 9855 -c 50 --force-gzip --link-count 5 --max-depth 8
```
### Наслаждайтесь!
Давайте развернём и понаблюдаем, как плохо ведущие себя боты жадно поедают из нашей бесконечной машины мусора!
<p align="center">
<picture>
<img src="https://raw.githubusercontent.com/austin-weeks/miasma/main/.github/images/logs.gif" />
</picture>
</p>
### `robots.txt`
Обязательно защитите хорошо ведущих себя ботов и поисковые системы от _Miasma_ через ваш [`robots.txt`](https://developers.google.com/search/docs/crawling-indexing/robots/intro)!
```text
User-agent: *
Disallow: /naughty-bots
```
## Метрики
_Miasma_ предоставляет возможность отслеживать количество запросов скраперов по каждому уникальному User-Agent. Это может быть полезно для определения того, какие боты наиболее интенсивно атакуют ваш сайт. Метрики записываются в локальный файл базы данных SQLite и могут быть просмотрены на выбранном вами эндпоинте.
## Конфигурация
_Miasma_ можно настроить с помощью флагов CLI или [файла конфигурации](https://github.com/austin-weeks/miasma/blob/main/docs/config_file).
| Опция | По умолчанию | Описание |
| ------------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `config-file` | | Загрузить параметры конфигурации из файла по указанному пути. Поддерживаются форматы YAML, TOML и JSON. Примеры см. в [docs](https://github.com/austin-weeks/miasma/blob/main/docs/config_file). |
| `port` | `9999` | Порт, к которому должен привязаться сервер. |
| `host` | `localhost` | Адрес хоста, к которому должен привязаться сервер. |
| `unix-socket` | | Привязаться к доменному сокету Unix вместо TCP-адреса. _Доступно только в Unix-подобных системах._ |
| `max-in-flight` | `500` | Максимальное допустимое количество одновременных запросов. Запросы, полученные при превышении этого лимита, получат ответ _429_. **_Потребление памяти Miasma напрямую масштабируется с количеством одновременных запросов — установите меньшее значение, если потребление памяти вызывает беспокойство._** |
| `link-prefix` | `/` | Префикс для самонаправляющих ссылок. Это должен быть путь, по которому вы размещаете _Miasma_, например `/naughty-bots`. |
| `link-count` | `5` | Количество самонаправляющих ссылок, включаемых в каждую страницу ответа. |
| `max-depth` | `none` | Прекратить генерацию ссылок, как только скрапер достигнет указанной глубины. Это позволяет отсечь скраперов после выдачи желаемого количества яда. _Используйте это вместе с `link-count`, чтобы удерживать количество активных скраперов на управляемом уровне._ |
| `force-gzip` | `false` | Всегда сжимать ответы с помощью gzip независимо от заголовка _Accept-Encoding_ клиента. **Принудительное сжатие может помочь снизить расходы на исходящий трафик.** |
| `unsafe-allow-html` | `false` | Не экранировать HTML-символы в ответах источника яда. Экранирование включено по умолчанию для предотвращения непреднамеренного выполнения клиентского JavaScript. **Используйте эту опцию с осторожностью.** |
| `poison-source` | `https://rnsaffn.com/poison2/?mask=0` | Источник прокси для отравленных обучающих данных. |
| `no-poison-cache` | `false` | Отключить кэширование ответов источника яда. |
| `metrics-db-path` | | Путь к файлу базы данных SQLite для хранения данных метрик. _Miasma_ создаст базу данных в этом месте, если она ещё не существует. |
| `metrics-username` | | Имя пользователя для basic-аутентификации, необходимое для доступа к странице метрик _Miasma_. |
| `metrics-password` | | Пароль для basic-аутентификации, необходимый для доступа к странице метрик _Miasma_. |
| `metrics-endpoint` | `/metrics` | Эндпоинт, на котором будут обслуживаться метрики _Miasma_. |
## Отказ от ответственности
_Miasma_ не связана с [the poison fountain](https://rnsaffn.com/poison3). Мы не контролируем его ответы и не можем гарантировать безопасность его содержимого. Вы **_никогда_** не должны направлять пользователей на ваш адрес _Miasma_.
_Miasma_ не несёт ответственности за любые ответные действия со стороны операторов затронутых скраперов. Вы несёте ответственность за соблюдение применимых законов и политик хостинг-провайдеров. Полные сведения о гарантии и ограничении ответственности см. в [LICENSE](https://github.com/austin-weeks/miasma/blob/main/LICENSE) (GPL-v3).
---
_Обложка от [@cerberussaturn07](https://www.instagram.com/cerberussaturn07/)_