CSRF in PHP einfach und erfolgreich verhindern

Cross-Site Request Forgery, kurz CSRF, ist ein Webseiten-übergreifender Angriff. Der Angreifer kann Aktionen auf der Webanwendung ausführen, zu denen er nicht berechtigt ist. PHP ist davon genau so betroffen wie andere Programmiersprachen auch.

Ein Beispiel

Als Mitarbeiter einer Firma bin ich im Backend eingeloggt und kann per Formular Gutschriften auf Kundenkonten buchen. Ich öffne die Webseite eines Angreifers. Diese Webseite sendet ein Formular an die Backend-Adresse ab, und erteilt somit eine Gutschrift.

Wer ist betroffen?

Überall wo Aktionen im eigenen Namen durchgeführt werden können, zum Beispiel Profiländerungen, Abstimmungen, etc. solltest du gegen CSRF vorgesorgen. Denn hier könnten zum Beispiel die erweiterten Berechtigungen eines anderen Users ausgenutzt werden. Ebenso könnte sich ein Angreifer als jemand anderes ausgeben.

Wie kann man CSRF in PHP verhindern?

Die wirksamste Maßnahme sind CSRF-Tokens. Dabei handelt es sich um zufällige, einmalig nutzbare Zeichenketten. Die Seite, die eine Aktion auslösen darf kennt diesen Token und sendet ihn bei Anfragen mit.

In der Praxis ist das einfacher als das vielleicht klingt. Bei der Nutzung von Frameworks für das Erstellen von Formularen, kann man eine Basisklasse mit CSRF-Element erstellen und alle andere Formulare davon erben lassen.

Stehen diese Mittel nicht zur Verfügung, kann ein zufälliger Wert in die Session gespeichert werden, welcher vor dem Ausführen der Aktion mit dem übermittelten Wert verglichen wird. Stimmen sie überein kann die Aktion durchgeführt werden.

Zend Framework

Eine Beispiel-Basisklasse mit Zend Form sähe zum Beispiel so aus. Beachte, dass bei mehr als einem Formular auf einer Seite, die Tokens unterschiedlich benannt werden müssen. Weitere Infos: Zend\Form Dokumentation

<?php

class BaseForm extends Zend\Form\Form
{
    public function __construct()
    {
        parent::__construct();
        $this->add(new \Zend\Form\Element\Csrf('csrftoken'));
    }
}

Wichtig ist auch, dass Aktionen die per Link durchgeführt werden, also einfachem GET-Request, auch mit einem Token abgesichert werden müssen. Hier könnte man z.B. den Url-ViewHelper überschreiben um das senden Tokens nicht zu vergessen.

Einschränkungen

CSRF kann nicht vor Aktionen die durch XSS durchgeführt wurden schützen, da so potentiell Code eingeschleust werden könnte, der den CSRF-Token auslesen kann.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert