Namų darbas — suvaidink ataką, patikrink prod
Padaryk savą.
-
Suvaidink ataką. Išsaugok tai kaip failą diske ir atsidaryk naršyklėje būdamas prisijungęs:
<form action="http://localhost:8080/logout" method="post"><button>Click me</button></form>Paspausk mygtuką. Tai POST į
/logoutiš kito šaltinio (file://puslapio), nešantis tavo sesijos slapuką — būtent CSRF forma. Jis atmetamas (nėra žetono), ir lieki prisijungęs. Dabar palygink: tikras Log out mygtukas SignFlow antraštėje veikia, nes jo forma neša žetoną. Tai visa apsauga, matoma iš abiejų pusių. -
Įrodyk, kad produkcija lieka griežta. Paleisk su
APP_ENV=prod SESSION_SECRET=test go run ./cmd/signflow. Plaintext išimtis dabar praleidžiama. POST beOrigin/Refereratmetamas — griežta šaltinio patikra apšarvuota, nors vis dar esi ant http lokaliai. (Būtent tai saugo įdiegtą svetainę; dev apėjimas tikrai tik dev.) -
Perskaityk žetono slapuką. DevTools → Cookies rask
_gorilla_csrf. Tai slapuko pusė; paslėptas laukas — formos pusė. Middleware tikrina, ar jie atitinka. Ištrink slapuką, perkrauk formą, pateik → vėl 403, dabar dėl žetono priežasties, o ne referer priežasties. Dvi nepriklausomos patikros, kiekviena gali nulūžti atskirai.
Kur einam toliau. Autentifikacija beveik baigta — registracija, prisijungimas, atsijungimas, visi CSRF apsaugoti. Liko vienas srautas: o jei vartotojas pamiršta slaptažodį? 7 pamoka stato slaptažodžio atstatymą, o su juo — email.Sender sąsają: konsolės siuntėją, spausdinantį atstatymo nuorodą tiesiai į terminalą, kad visą srautą užbaigtum be API rakto, ir Resend siuntėją produkcijai. Atstatymo žetonas vienkartinis ir maišomas diske (vėl sesijų šablonas), o užbaigus atstatymą sunaikinamos visos sesijos ir žetonai — slaptažodžio keitimas turi atjungti kiekvieną įrenginį.