molily: Session hijacking verhindern

Beitrag lesen

Du verwirrst mich! Machst du einen Unterschied zwischen Nutzer- und Zugriffsrechten?

Nein.

Ich verstehe gerade nicht wieso ich da beim Lesen kein Token setzen soll, bei Formularen aber doch.

Das habe ich dir schon zweimal versucht zu erklären… falls ich es nicht schaffe zu vermitteln, was CSRF ist, so schaue dich bitte einmal selbst um.

CSRF = Beim Besuch einer fremden Website wird automatisch ein Request auf deinen Server gestartet. Das ist technisch möglich, ohne dass der Nutzer es merkt.

Wenn das nur ein Lesezugriff ist, der auf dem Server nichts verändert, ist das kein Sicherheitsrisiko.

Wenn die fremde Website aber ein Formular absendet, welches bei dir einen Datensatz erzeugt/ändert/löscht, ist das ein Sicherheitsrisiko. Denn der Benutzer könnte bei dir eingeloggt sein. Das ist CSRF und das muss man verhindern. Ein Cookie alleine tut das nicht!

CSRF funktioniert so:

1. Nutzer loggt auf example.com ein, Session-Cookie wird gesetzt. Jeder Request an example.com sendet nun den Cookie mit.
2. Nutzer besucht die Website des Angreifers attacker.example.net. Diese beinhaltet ein POST-Formular, welches http://example.com/delete-record als Ziel hat. Per JavaScript wird das Formular automatisch abgesendet.
3. Der Browser startet einen POST-Request zu example.com, ohne dass der Nutzer es merkt. Der Session-Cookie wird mitgesendet, die Session ist gültig und der Nutzer hat auch Schreibrechte.
4. Für die Software auf example.com sieht alles so aus, als wäre die Aktion vom Nutzer initiiert. Also wird im Beispiel ein Datensatz gelöscht. In Wirklichkeit wurde der Nutzer ausgetrickst.

Und was für einen Unterschied macht es ob ich den Token als hidden field oder in der Session oder "per Hand" in einem Cookie speichere?

Der Cookie wird automatisch bei jedem Request auf die Site, die den Cookie gesetzt hat, mitgesendet. Eine fremde Site kann einen Request auf deine Site erzeugen und der Cookie wird automatisch als Request-Header übermittelt. Das Vorhandensein des Cookies bedeutet nicht, dass der Nutzer die Aktion initiiert hat.

Eine fremde Site kann jedoch keinen Request erzeugen, welcher den Token im Request-Body übermittelt. Die fremde Website kann nämlich nicht an diesen Token kommen. (Es sei denn, es gibt z.B. eine XSS-Sicherheitslücke in deiner Site.) Wenn der Token also fehlt, liegt ein CSRF-Versuch vor.

Cookie im HTTP-Request-Header + Token im HTTP-Request-Body (z.B. in den Formulardaten) = Schutz vor CSRF

Mathias