Einfürung
Im ASP.NET gibt es bei den Controller-Klassen das Schlüsselwort: [ValidateAntiForgeryToken]. Dieses Schlüsselwort kann oder sollte man bei Bedarf
oberhalb einer Methode in einer Controller-Klasse setzen. Dies dient dafür, dass die Methode nur dann ausgeführt wird, wenn der AntiForgeryToken gültig ist. Ansonsten wird die Methode nicht einmal betreten.
Controller:
Was ist ein AntiForgeryToken?
Hier handelt es sich um einen Hashcode, der auf der HTML-Seite generiert und dann an die Controller-Methode mitgegeben wird.
Somit wird sichergestellt, dass der Aufruf der Controller-Methode vom gleichen Server aus erfolgt ist. Dies verhindert das Aufrufender Methode von ausserhalb des Servers bzw. von einer Drittseite, der von einem Hacker generiert wurde.
Somit ist diese Methode sicherer als nur den [Authorize] Schlüsselwort einzusetzen. Denn beim Authorize Schlüssel, ist es für die Hacker trotzdem möglich, mit einer Drittseite sich einen Zutritt zu verschaffen.
Wie funktioniert’s?
Man muss lediglich auf der HTML-Seite einen AntiForgeryToken generieren und diesen dann beim Submit oder bei einam Ajax-Call mitgeben.
Hier ein Beispiel mit einem Ajax-Call:
HTML-Seite: HTML-Code
In der Html.BeginForm() Methode wird ein neues Element mit der id = “__AjaxAntiForgeryForm” mitgegeben.
Innerhalb des usings, generiert die Methode Html.AntiForgeryToken() den Token und platziert diesen in eine
interne Array.
HTML-Seite: JavaScript
Beim JavaScript Section sieht man, dass der AntiForgeryToken mit der form-id, den wir oben im HTML-Code definiert haben, abgeholt wird. Dieser wird in die Variable token gespeichert. Die token Variable geben wir dann im data-object des Ajaxs, als Wert mit.
Wenn nun die Controller-Methode aufgerufen wird, darf die Methode ausgeführt werden, da der AntiForgeryToken
vorhanden und gültig ist.
Fazit:
Das Prinzip zu verstehen ist einfach, jedoch die Implementierung kann etwas schwieriger sein, da es sehr viele verschiedene Möglichkeiten gibt, diesen Prozess abzubilden. Die klassische Variante ist, bei einem Formular, der mittels eines Submit-Buttons an den Controller geschickt wird.
Weitere Infos unter: http://stackoverflow.com