Cookies afschermen: in je eigen project
In deze reeks zette je httponly op de sessie-cookie, zag je dat FastAPI
samesite="lax" al vanzelf zet, bouwde je een endpoint om uit te loggen en liet
je een sessie op de server verlopen. Doe hetzelfde in je gastenboek, of in een
eigen project dat je bouwde. Je begint bij de cookie zelf.
Werk in je eigen project, niet in de map veiligheid-cookies. Test daarna met
je eigen server op 127.0.0.1.
De sessie-cookie afschermen
Zoek in je project naar set_cookie. In je gastenboek staat hij sinds Sessies
in POST /inloggen, met key="sessie_id". Zet er httponly=True en
samesite="lax" bij:
antwoord.set_cookie(
key="sessie_id",
value=sessie_id,
max_age=60 * 60 * 24 * 30,
httponly=True,
samesite="lax",
)
Start je server, open je gastenboek en log opnieuw in, zodat de server een nieuwe cookie zet.
Er gaat iets mis
Het sessie-id staat er nog
document.cookie laat sessie_id nog zien, of in App staat geen vinkje
bij HttpOnly.
Oorzaak: dit is de cookie van vóór de wijziging. De nieuwe instellingen komen pas mee als de server de cookie opnieuw zet.
Oplossing: log opnieuw in, en kijk dan weer.
Andere cookies zonder vinkje
document.cookie geeft bijvoorbeeld 'volgorde=nieuw'.
Oorzaak: dat is een andere cookie van je project, zoals die van de links voor de volgorde uit Cookie of sessie?. Hij bepaalt alleen hoe de lijst staat; er hangen geen rechten aan.
Oplossing: niets. Alleen de cookie met het sessie-id hoort httponly te
hebben.
Opdracht
Opdracht 1: Make - In je eigen project
Geef in je eigen project de sessie een eigen verlooptijd, en zorg voor een knop
om uit te loggen. Kijk ook of elke set_cookie voor sessie_id de twee
instellingen van hierboven heeft.
Tip
Denk aan de oude cookie: log na elke wijziging opnieuw in, zodat de server een
nieuwe zet. Lees je de sessie op meer plekken uit, dan gebruik je overal
sessie_ophalen uit les 6.
Zoek naar sessies.get: in je gastenboek staat het in GET /gastenboek,
POST /gastenboek en POST /verwijderen, en vaak ook in GET /berichten,
GET /berichten/lijst, DELETE /bericht/{sleutel} en alles_wissen. Laat
het in sessie_ophalen zelf staan.
Antwoord
Loop deze lijst af:
- Bij elke
set_cookievoorsessie_idstaanhttponly=Trueensamesite="lax". - Na een nieuw bezoek laat
document.cookiede sessie-cookie niet meer zien, en staat er in het tabblad App een vinkje bij HttpOnly. - In
POST /inloggenkrijgt de nieuwe sessie een"tot": time.time() + GELDIG. Elk endpoint dat de sessie leest, haalt hem op metsessie_ophalen, zodat een verlopen sessie telt als niet ingelogd. - Er is een
@app.post("/uitloggen")dat de sessie insessies.dbweggooit en de cookie weghaalt metdelete_cookie, met een formulierknop (<form method="post" action="/uitloggen">) op je pagina. - Een cookie die je eigen JavaScript wél moet lezen, zoals een voorkeur voor
een donker thema, krijgt geen
httponly. Daar hangen ook geen rechten aan.
antwoord.set_cookie(
key="sessie_id",
value=sessie_id,
max_age=GELDIG,
httponly=True,
samesite="lax",
)
Na sessie_ophalen telt elke sessie zonder tot als verlopen. Wie al was
ingelogd, ook jijzelf, ziet dan weer het formulier om in te loggen.
Door naar les 8: in de praktijk.