Premještanje administrativnog sučelja na admin.example.com stvarno je poboljšanje: drži administracijske kolačiće podalje od javnih stranica, daje dvjema aplikacijama odvojene predmemorije i omogućuje da se stroža mrežna politika usmjeri na jedno ime hosta. Ali to nije kontrola protiv CSRF-a i ne čini kod javnog lokaliteta sigurnim za držanje otvorenim pred prijavljenim administratorom. Razdvajanje mijenja ono što preglednik smatra granicom, a ne ono što poslužitelj provjerava, zato obavite ove četiri provjere prije nego što kažete da je gotovo.

Čitajte origin i lokalitet kao dvije različite riječi

Origin je shema, host i port, pa su https://www.example.com i https://admin.example.com različiti origini. Lokalitet, u smislu SameSite, je shema plus registrirana domena, pa su ta dva imena hosta obično isti lokalitet. Ta razlika je cijela zamka: atribut SameSite neće vam pomoći između sestrinskih poddomena jer preglednik zahtjev uopće ne smatra unakrsnim. Usmjerite administrativno sučelje na stvarno drugu registriranu domenu, poput admin-example.net, i zahtjev doista postaje unakrsni, i tu SameSite=Lax ili Strict počinje obavljati posao na koji se možete osloniti.

Testirajte to u pregledniku umjesto da o tome rasuđujete.

Učitajte javni lokalitet, otvorite razvojne alate i pogledajte koje kolačiće preglednik pridružuje zahtjevu prema administracijskom hostu. Ako kolačić nema atribut Domain, samo je za host i ostaje na svom imenu; ako nosi Domain=example.com, putuje do svake sestre, i nova poddomena vam za taj kolačić nije donijela ništa.

Odvojite može pročitati odgovor od može poslati zahtjev

Politika istog origina ograničava čitanje odgovora između origina. Ne zaustavlja slanje zahtjeva i ne sprječava formu da nosi vjerodajnice koje preglednik već ima. Jednostavan zahtjev, s tipom sadržaja forme ili običnim GET-om, dostavlja se bez prethodne provjere; CORS zatim odlučuje smije li skripta koja poziva pročitati odgovor. CSRF u potpunosti živi na strani slanja.

Zato poslužitelju treba izričita provjera za operacije koje mijenjaju stanje. Token za sinkronizaciju vezan uz sesiju, ili kolačić dvostrukog slanja koji se uspoređuje na poslužitelju, pokriva taj slučaj; usporedbu Origin ili Referer vrijedi dodati kao druga vrata, ali ne kao jedina, jer ne nosi svaki zahtjev zaglavlje i ne čuva ga svaki proxy. OWASP-ove smjernice za sprječavanje CSRF-a tretiraju SameSite kao jedan sloj među nekoliko upravo zato.

Odlučite što mrežna kapija doista dokazuje

Popis dopuštenih VPN izlaza ispred administracijskog hosta dobra je kontrola i slaba tvrdnja o identitetu. Dokazuje da je zahtjev došao s adrese koju VPN daje, koju mogu dijeliti svi na tom izlazu, i ne govori ništa o tome koja osoba ili uređaj stoji iza njega. Tretirajte ga kao ulazni filtar, ne kao autentikaciju.

Držite ga neovisnim o provjerama na razini zahtjeva. Ako je popis jedina stvar između napadača i krajnje točke koja mijenja stanje, jedna pogrešno konfigurirana ruta, jedan split-tunnel klijent ili jedno posuđeno prijenosno računalo uklanja kontrolu u potpunosti.

Bilježite i odbijanja izvan očekivanih raspona. Njihov nalet najkorisniji je signal da netko ispituje granicu koju ste upravo izgradili, a tišina je signal da se filtar uopće ne doseže.

Držite kolačiće, prijavu i autorizaciju izričitima

Opseg kolačića odlučuje većinu ishoda. Kolačić roditeljske domene šalje se administracijskom hostu, pa skripta ubačena na javni lokalitet može djelovati sa sesijom administratora; kolačić samo za host ne može. Preferirajte oblik samo za host, dodajte atribut Secure i rabite prefiks __Host- gdje ga platforma podržava, jer taj prefiks zahtijeva Secure, Path=/ i bez atributa Domain. Čitajte zaglavlje odgovora, a ne staklenku kolačića: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, bez atributa Domain. Preglednik odbacuje __Host- kolačić koji nosi Domain, pa kolačić koji se još vidi na sestrinskim hostovima dokaz je da prefiks nikada nije primijenjen.

Zatim držite autorizaciju na poslužitelju, po zahtjevu, na svakoj administracijskoj krajnjoj točki, ne samo pri prijavi. Zahtjev s dopuštene mreže još mora biti autentificiran i autoriziran za operaciju koju traži; ime hosta nije akter. Ako javna i administracijska aplikacija dijele tijek prijave ili spremište sesija, zapišite taj odnos jer je to najkraći put od greške na javnom lokalitetu do administracijske radnje.

Ponovno provjerite granicu nakon razdvajanja

Pokrenite negativne testove, ne samo sretan put: unakrsna forma bez tokena mora biti odbijena, token iz druge sesije mora biti odbijen i nijedan GET ne smije mijenjati stanje. Provjerite atribute kolačića u razvojnim alatima, potvrdite da se provjera Origin aktivira na neusklađen zahtjev i pokušajte administracijski host izvan VPN raspona da vidite filtar na djelu.

Ništa od ovoga ne uklanja XSS grešku unutar same administracijske aplikacije. Odvojeno ime hosta granica je izolacije na strani preglednika sa stvarnom vrijednošću i nije zamjena za sprječavanje nesigurnog izvršavanja koda ili za zaštitu zahtjeva na strani poslužitelja. Nakon razdvajanja popis je kraći nego što izgleda: različit origin, kolačići samo za host, token na svaku promjenu, ulazni filtar kojem ne vjerujete kao identitetu i autorizacija odlučena po zahtjevu.

Povezani članci