Ga naar hoofdinhoud

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.

tip

Werk in je eigen project, niet in de map veiligheid-cookies. Test daarna met je eigen server op 127.0.0.1.

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.

Controlevraag
Je sessie-cookie heeft nu httponly en samesite lax. Welke van deze drie houdt dat nog niet tegen?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

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_cookie voor sessie_id staan httponly=True en samesite="lax".
  • Na een nieuw bezoek laat document.cookie de sessie-cookie niet meer zien, en staat er in het tabblad App een vinkje bij HttpOnly.
  • In POST /inloggen krijgt de nieuwe sessie een "tot": time.time() + GELDIG. Elk endpoint dat de sessie leest, haalt hem op met sessie_ophalen, zodat een verlopen sessie telt als niet ingelogd.
  • Er is een @app.post("/uitloggen") dat de sessie in sessies.db weggooit en de cookie weghaalt met delete_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.