This commit is contained in:
Mateusz Gruszczyński committed 2026-11-04 23:44:40 +01:00
1 parent 50b53e72f0
commit 439cc20dcf
6 files changed
+110 -8

No files matched your search

+29
View File
@@ -127,3 +127,32 @@ Jeżeli docelowy serwer ma inną architekturę/endianness niż źródłowy x86_6
- build z `-trimpath` i usuniętymi symbolami/debug info.
Nie da się zagwarantować, że stos technologiczny będzie całkowicie nierozpoznawalny na podstawie zachowania sieci/TLS. Celem jest brak prostych bannerów, wersji i sygnatur frameworka.
## Rate limiting
Domyślnie **wyłączony** (`RATE_LIMIT_ENABLED=false`) — endpointy mają limity
zahardkodowane w kodzie od początku, ale same w sobie nie chronią niczego
krytycznego (ServerQuery i tak ma własny timeout, `channelcreate` i tak
wymaga poprawnego tokenu CSRF), a przy nietypowym ruchu (kilku odwiedzających
za tym samym IP/NAT, kilka kart, lightbox z wykresami) dawały false-positive
`429` bez realnej korzyści. Włącz (`RATE_LIMIT_ENABLED=true`), jeśli chcesz
dodatkową warstwę ochrony przed nadużyciami na konkretnym endpoincie.
Każdy limit jest per-IP (po rozwiązaniu `TRUSTED_PROXIES`/`X-Forwarded-For`,
patrz `clientIP()` w `internal/web/server.go`) i liczony w oknie czasowym
podanym w nawiasie:
| Zmienna | Endpoint | Domyślnie | Co chroni |
|---|---|---|---|
| `RATE_LIMIT_STATS` | `GET /stats` (na minutę) | 60 | render strony statystyk |
| `RATE_LIMIT_STATS_LIVE` | `GET /stats/live` (na minutę) | 60 | auto-odświeżanie licznika online co 60 s |
| `RATE_LIMIT_GRAPH` | `GET /graph/*.png` (na minutę) | 600 | wykresy RRD — PNG są cache'owane na dysku ~55 s, więc limit jest wysoki: jeden widok strony sam zużywa 6 zakresów × 2 motywy, a NAT/kilka kart to łatwo pomnoży |
| `RATE_LIMIT_CHANNEL` | `POST /channel/create` (na minutę) | 40 | tworzenie kanału |
| `RATE_LIMIT_VERIFY` | `POST /verify/start` (na minutę) | 10 | start weryfikacji nicku (NAT) |
| `RATE_LIMIT_VERIFY_DONE` | `POST /verify/complete` (na minutę) | 10 | wpisanie 6-cyfrowego kodu |
| `RATE_LIMIT_CREATE` | `POST /channel/create` po weryfikacji (na godzinę) | 5 | utworzenie kanału po weryfikacji nicku przez NAT |
Przy przekroczeniu limitu endpoint odpowiada `429 Too Many Requests` z
nagłówkiem `Retry-After: 60`. Wartości domyślne są w `.env.example` i
`packaging/ts3monolith.default` — dostosuj je do realnego ruchu na danej
instalacji zanim włączysz `RATE_LIMIT_ENABLED` na produkcji.