Czego nie wiem
Uczciwie, na koniec tomuMój skrypt czyta dużo. Tu jest wszystko, czego nie robi nigdy, i dowód, który sprawdzisz sam.
- Nic o Tobie nie trzymam dłużej niż 15 minut po Twoim ostatnim ruchu.
- Nie ustawiłem żadnego ciasteczka.
- Mój skrypt działał tylko na stronie 2.
- Logi nie znają Twojego adresu ani słów z pola.
Czego mój skrypt nie robi nigdy
- Nie czyta niczego przed Twoim kliknięciem. Strona 1 nie ma skryptu; rusza dopiero strona 2, którą otwiera tylko Twoje kliknięcie.
- Nie prosi o żadne pozwolenie: kamera, mikrofon, lokalizacja, powiadomienia, odczyt schowka, czujniki ruchu, czcionki, okna, sieć lokalna.
- Nie zostawia niczego, co przeżyje kartę: ciasteczek, localStorage, sessionStorage, IndexedDB, Cache Storage, service workerów. Przeglądarka może trzymać sam plik skryptu w pamięci podręcznej, jak każdy plik.
- Nie skanuje Twojego komputera ani sieci: żadnych portów localhost, adresów w sieci domowej ani adresów chrome-extension://. To granica między lekcją a włamaniem (art. 267 Kodeksu karnego).
- Nie zbiera ukradkiem: żadnych ukrytych pól na autouzupełnianie. Czyta tylko to, co sam wpiszesz albo wkleisz w pole „Napisz coś”, i to, co skopiujesz z mojej strony.
- Nie słucha klawiszy nigdzie poza tym jednym polem i nie zapisuje rytmu Twojego pisania (odstępów między pojedynczymi klawiszami).
- Nie rozpoznaje Cię przy następnej wizycie: bez ciasteczka i bez spisu odcisków palców. Pamięć to tom 2.
- Nie rozmawia z nikim poza mną: żadnych CDN-ów, analityki ani cudzych serwerów STUN.
- Nie pisze po stronie. Każde słowo i każdy obrazek, które widzisz, przyszły ode mnie, z serwera.
Dowód: dwa nagłówki
Każda odpowiedź niesie nagłówek Content-Security-Policy. Przeglądarka pilnuje go sama, nawet gdybym próbował oszukać, ale tylko tak daleko, jak sięga nagłówek: niżej mówię, gdzie się kończy, a resztę pokazuje kod.
Strona 2
jedyna ze skryptemContent-Security-Policy: script-src 'self'; connect-src 'self'; base-uri 'none'; form-action 'none'
script-src 'self': przeglądarka uruchomi tylko skrypt z tej domeny, czyli mój. connect-src 'self': to, co skrypt wysyła przez fetch, beacony albo gniazda (WebSocket), może trafić tylko do mnie. Inne drogi wyjścia, jak wczytanie obrazka albo przeniesienie strony pod inny adres, są poza zasięgiem tego nagłówka; kod skryptu, podlinkowany niżej, pokazuje, że nie używa żadnej z nich.
Bocznych drzwi ten nagłówek nie obejmuje: przeglądarki nie stosują connect-src do WebRTC. Dlatego mówię wprost, gdzie puka mój skrypt: stun:js.watch-kube.bryzek.it:31478, mój własny serwer STUN. Sprawdzisz to w kodzie.
Strona 1, strona 3, akta i ta strona
Content-Security-Policy: script-src 'none'; base-uri 'none'; form-action 'none'
script-src 'none' zabrania wszelkich skryptów, więc przeglądarka nie uruchomiłaby ich tutaj, nawet gdybym próbował. Ten sam nagłówek mają tomy 1 i 2.
Przeczytaj skrypt: /static/watch.js Jeden plik, bez bibliotek, bez minifikacji, z komentarzami.
Co mój skrypt czyta i wysyła
Wszystko, po kolei. Czego tu nie ma, tego mój skrypt nie robi; gdyby robił, byłby to błąd.
- Kiedy
- Tylko na stronie 2, którą otwiera wyłącznie Twoje kliknięcie, na przykład w przycisk „Pokaż, co widzi skrypt”. Strona ładuje go asynchronicznie (async), a on czyta najwyżej przez 3 sekundy.
- Zegar i języki
- Strefa czasowa, ustawienia regionalne, zegar 12- czy 24-godzinny, pierwszy dzień tygodnia i języki przeglądarki. Do tego różnica między Twoim zegarem a moim: skrypt wysyła do mnie jedno zapytanie HEAD o własny plik i czyta godzinę z nagłówka Date odpowiedzi.
- Karta graficzna
- Producent i nazwa karty z WebGL (pełna nazwa, jeśli przeglądarka ją podaje) oraz producent i architektura z WebGPU.
- Procesor i pamięć
- Liczba rdzeni (hardwareConcurrency) i, jeśli przeglądarka ją podaje, pamięć (deviceMemory).
- Ekrany
- Rozmiar ekranu, część wolna od paska zadań albo Docka i miejsce, w którym się zaczyna, skalowanie (devicePixelRatio), drugi monitor (screen.isExtended), położenie okna i rozmiar okna strony.
- Bateria
- Poziom naładowania i to, czy się ładuje (odpowiadają tylko przeglądarki oparte na Chromium).
- Klawiatura
- Co wpisałoby dwanaście klawiszy w Twoim układzie (navigator.keyboard.getLayoutMap, tylko Chromium). Żadnego klawisza nie podsłuchuje.
- Głosy
- Ile głosów ma Twój komputer, w ilu językach, do dziesięciu języków i do dziesięciu nazw.
- Odciski palców
- Mały rysunek zrobiony w pamięci (obrazek PNG i jego skrót SHA-256) i krótki dźwięk wyrenderowany w pamięci i nigdy nieodtworzony, każde zrobione dwa razy, żeby wykryć szum, oraz kilka wyników matematyki przeglądarki.
- Boczne drzwi
- Kandydaci ICE, czyli linie, którymi wymieniłaby się rozmowa wideo, zebrane przy moim własnym serwerze STUN (
stun:js.watch-kube.bryzek.it:31478) i wysłane dokładnie tak, jak zapisała je przeglądarka, razem z adresem, który widział mój serwer STUN. Żadne połączenie nie powstaje. - Rozszerzenia
- Portfele, które odpowiadają na publiczne wołanie EIP-6963 swoją nazwą, to, czy istnieje window.ethereum, i atrybuty, które rozszerzenia same dopisują do <html> i <body> mojej strony (czytane po 2 sekundach). Niczego nie sonduje.
- Ruchy
- Tylko póki strona 2 jest otwarta: położenie wskaźnika (najwyżej 10 razy na sekundę), kółko (20 razy) i przewinięcie (5 razy), te trzy tylko przez pierwsze 2 minuty; kliknięcia i ich miejsce; rodzaj wskaźnika (mysz, rysik, dotyk) i najmocniejszy nacisk; nad którym z moich kadrów i jak długo zatrzymał się wskaźnik (od 1 sekundy); wyjście z karty i powrót; to, co skopiujesz z mojej strony (do 200 znaków).
- Pole „Napisz coś”
- To, co jest w polu, odczytywane najwyżej raz na sekundę, gdy piszesz, więc rytm pisania nie opuszcza przeglądarki, i jeszcze raz, gdy wychodzisz z karty albo ze strony lub klikasz link; i to, co do niego wkleisz. Za każdym razem do 500 znaków.
- Wysyłanie
- Odczyty raz, jednym zapytaniem POST; ruchy w małych paczkach, mniej więcej cztery razy na sekundę. Tylko do tej strony, z tokenem strony.
- Koniec
- Skrypt sam się wyłącza, gdy opuszczasz stronę 2, a najpóźniej po 10 minutach.
Co trzymam i jak długo
To, co skrypt odczytał, i wszystko, co zanotował na stronie 2, łącznie ze słowami z pola, leży pod tokenem Twojej strony. Odczyty zapisuję raz i znikają najpóźniej 15 minut po tym, jak dotarły. Notatki znikają najpóźniej 15 minut po pierwszej paczce; kolejne paczki tego nie przedłużają, niezależnie od tego, jak długo jesteś na stronie 2. Token z Twoim adresem IP i User-Agentem wygasa 15 minut po stronie 1; do tego czasu akta sprawy pokazują Ci wszystko.
Wszystko to jest tylko w pamięci mojego serwera: nic nie trafia na dysk ani do logów.
Martwe sztuczki
Dwóch sztuczek ten tom nie pokazuje, bo przeglądarki je zabiły:
- Rozmiar dysku i tryb prywatny
- Strony pytały przeglądarkę, ile mogą u niej zapisać, z odpowiedzi zgadywały rozmiar dysku, a z mniejszej odpowiedzi okno prywatne. Dziś Chrome podaje każdej stronie tę samą stałą wartość, około 10 GB (zmierzyłem w Chrome 156), a jego twórcy zapowiedzieli taką samą poprawkę dla trybu incognito.
- Adresy w domowej sieci
- Kiedyś każda strona mogła przez WebRTC odczytać adres Twojego komputera w domowej sieci. Dziś duże przeglądarki chowają go za losową nazwą kończącą się na .local albo w ogóle go nie podają. Co z tego zostało, pokazuje akt 2.
Prawdziwe przypadki
To, co mój skrypt robi jawnie, inni robili po cichu:
- „No boundaries”, 2017
- Badacze z Princeton znaleźli skrypty nagrywające sesje, czyli każdy ruch na stronie, na 482 z 50 000 najpopularniejszych stron, i to była dolna granica.
- eBay, 2020
- Według doniesień skrypt na stronie eBay sprawdzał porty localhost na komputerach odwiedzających z Windows, szukając programów do zdalnego pulpitu, podobno w walce z oszustwami. Mój skrypt nie dotyka portów Twojego komputera.
- Leaky Forms, 2022
- Badacze sprawdzili 100 000 najpopularniejszych stron: na 1844 (oglądanych z UE) i 2950 (z USA) adres e-mail wpisany w formularz trafiał do firm śledzących, marketingowych i analitycznych, zanim ktokolwiek kliknął „wyślij”. Skrypty nagrywające sesje zebrały hasła na 52 stronach (USENIX Security 2022).
- Local Mess, 2025
- Meta Pixel i Yandex Metrica na zwykłych stronach przekazywały Twoje wizyty przez localhost, czyli adres samego telefonu, aplikacjom Facebook, Instagram i aplikacjom Yandex na Androidzie, a te łączyły je z tym, kim jesteś w aplikacji. Ujawnione w czerwcu 2025 r.; Meta przestała 3 czerwca 2025 r., Yandex też; Chrome 137 zaczął to blokować.
- Chrome 142, 2025
- Od Chrome 142 strona, która chce zwykłymi zapytaniami sięgnąć do Twojej domowej sieci albo do samego komputera, musi najpierw zapytać Cię o zgodę. WebRTC nie jest tym jeszcze objęte. Mój skrypt o zgodę nie prosi, bo tam nie zagląda.
- LinkedIn, 2026 (doniesienia)
- Skrypt LinkedIna podobno sprawdza w przeglądarkach około 6000 rozszerzeń. Doniesienia z 2026 r. są sporne, a LinkedIn je kwestionuje. Mój skrypt słyszy tylko rozszerzenia, które same się przedstawiają.
Co się dzieje z danymi
- Administrator
- watchout.click contact@watchout.click
- Cel
- Pokazanie Ci, w celu edukacyjnym, co jeden skrypt na jednej stronie odczytuje o Twoim komputerze, Twojej kryjówce i Twoich ruchach. Nic więcej: żadnej analityki ani reklam.
- Podstawa prawna
- Odczyt Twojej przeglądarki moim skryptem: Twoje żądanie, czyli kliknięcie „Pokaż, co widzi skrypt” (art. 399 ust. 3 pkt 2 Prawa komunikacji elektronicznej: usługa, której zażądałeś). To, co skrypt odczytał i zanotował: prawnie uzasadniony interes, czyli edukacyjny cel tej strony: pokazanie Ci, co widzi jeden skrypt (art. 6 ust. 1 lit. f RODO).
- Dane
- To, co odczytał mój skrypt (lista wyżej); Twoje ruchy na stronie 2, łącznie z tym, co wpisałeś albo wkleiłeś w pole, i tym, co skopiowałeś z mojej strony; a w tokenie strony Twój adres IP i User-Agent.
- Odbiorcy
- Nikt poza mną: wszystko zostaje na moich serwerach. Mój skrypt rozmawia tylko z tą stroną i z moim własnym serwerem STUN, a ja niczego nie przekazuję dalej. Miejsce i dostawcę Twojego adresu sprawdzam w bazie na własnym serwerze, nikogo nie pytając.
- Okres przechowywania
- To, co skrypt odczytał: najwyżej 15 minut od chwili, gdy dotarło. To, co zanotował: najwyżej 15 minut od pierwszej paczki. Token z Twoim adresem IP i User-Agentem: 15 minut po stronie 1.
- Twoje prawa
- Masz prawo do dostępu do swoich danych (akta sprawy pokazują wszystko), ich usunięcia, ograniczenia przetwarzania i sprzeciwu, a także do wniesienia skargi do organu nadzorczego (w Polsce: Prezes UODO).
Dane geolokalizacyjne: IP Geolocation by DB-IP (CC BY 4.0). Czcionki: Patrick Hand i Patrick Hand SC (licencja SIL Open Font License), serwowane z tej strony.