TRACIO analizuje adres IP każdego odwiedzającego po stronie serwera. Oznacza sieci VPN, proxy, węzły wyjściowe Tor oraz połączenia z centrów danych, a także ustala geolokalizację na poziomie miasta oraz ASN. Cała analiza działa po stronie serwera, bez żadnych zależności po stronie klienta.
IP Intelligence dociera do Twojej aplikacji przez payload webhooka: obiekt
network (wartości logiczne VPN/proxy/Tor/centrum danych plus typ połączenia) oraz obiekt
geo (kraj, miasto, współrzędne, strefa czasowa, ISP) są dostarczane z każdym
webhookiem. Pełną strukturę payloadu oraz weryfikację podpisu opisano w sekcji Webhooks.
Klasyfikacja VPN, proxy, Tor i centrum danych jest ustalana na podstawie łączącego się IP
przy użyciu komercyjnych baz danych IP intelligence (IP2Location dla typu VPN/proxy/Tor,
MaxMind dla geolokalizacji i ASN). Każda z nich jest udostępniana jako pojedyncza wartość logiczna w
obiekcie network webhooka — w publicznym payloadzie nie ma podziału na poszczególne metody ani wskaźnika
pewności.
| Flaga | Pole | Znaczenie |
|---|---|---|
| VPN | network.vpn | IP należy do znanego dostawcy VPN |
| Proxy | network.proxy | IP jest proxy z centrum danych lub residential |
| Tor | network.tor | IP jest znanym węzłem wyjściowym Tor |
| Datacenter | network.datacenter | IP należy do dostawcy chmury/hostingu |
{ "network": { "vpn": true, "proxy": false, "tor": false, "datacenter": false, "connectionType": "residential" }}// `payload` is the webhook delivery body (/docs/webhooks)if (payload.network.vpn) { // visitor is connecting through a VPN}Proxy z centrów danych oraz proxy residential pojawiają się obie jako network.proxy; pochodzenie z centrum
danych jest dodatkowo raportowane jako network.datacenter. Klasyfikacja pochodzi z
bazy danych proxy IP2Location, która obejmuje głównych dostawców chmury/hostingu (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr i innych).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "datacenter" }}Dopasowanie węzła wyjściowego Tor na łączącym się IP pojawia się jako network.tor. Osobno
sama przeglądarka Tor jest wykrywana po stronie klienta na podstawie jej konfiguracji anty-fingerprintingowej
(odporność canvas/WebGL, strefa czasowa UTC, zaokrąglony rozmiar ekranu) — zobacz
Smart Signals.
Geolokalizacja na poziomie miasta oraz ASN są ustalane po stronie serwera na podstawie łączącego się IP
(MaxMind) i dostarczane w obiekcie geo webhooka.
| Pole | Typ | Opis |
|---|---|---|
geo.country | string | Kod kraju ISO 3166-1 alpha-2 |
geo.city | string | Nazwa miasta |
geo.lat | number | Przybliżona szerokość geograficzna |
geo.lon | number | Przybliżona długość geograficzna |
geo.timezone | string | Identyfikator strefy czasowej IANA |
geo.isp | string | Nazwa dostawcy usług internetowych |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague", "isp": "Comcast Cable" }}Dopasowywanie do list blokujących IP oraz śledzenie velocity (aktywność między adresami IP / między krajami)
nie są częścią bieżącego publicznego kontraktu. Ani payload webhooka, ani
dashboard nie udostępniają kategorii list blokujących ani interwałów velocity. Powierzchnia webhooka
dla ryzyka sieciowego ogranicza się do logicznych flag network oraz
typu połączenia; używaj ich razem z polami decision i bot (zobacz
Smart Signals) do decyzji o ryzyku.
To odczytuje bezpośrednio obiekt network z payloadu webhooka. Pełny payload oraz weryfikację podpisu opisano w sekcji
Webhooks.
// `payload` is the webhook delivery body (/docs/webhooks)function assessIPRisk(payload: WebhookPayload) { const { vpn, proxy, tor, datacenter } = payload.network
const risks: string[] = [] let riskLevel = "low"
if (tor) { risks.push("Tor exit node") riskLevel = "critical" }
if (vpn) { risks.push("VPN detected") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
if (proxy) { risks.push("Proxy detected") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
if (datacenter) { risks.push("Datacenter IP") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
return { riskLevel, risks }}