Übersicht. Standardmäßig wird empfohlen, ein eindeutiges CSRF-Token zu verwenden, das für jede Anforderung eindeutig ist. Warum? Weil ein Token pro Anforderung gegenüber bestimmten Arten von Implementierungsfehlern etwas widerstandsfähiger ist als ein Token pro Sitzung. Dies macht Token pro Anfrage wohl zur besten Wahl für die Entwicklung neuer Webanwendungen. Außerdem wird Sie kein Sicherheitsprüfer mit der Verwendung eines CSRF-Tokens pro Anforderung belästigen.
Wenn Sie ein Webanwendungsentwickler sind, ist dies alles, was Sie wissen müssen, und Sie können hier aufhören zu lesen. Wenn Sie jedoch ein Sicherheitsexperte sind, der sich über die detaillierten Gründe für diesen Rat wundert oder sich fragt, wie hoch das Risiko ist, wenn Sie ein Token pro Sitzung verwenden, lesen Sie weiter ....
Ein bisschen tiefer gehen. Die Wahrheit ist, dass ein einzelnes CSRF-Token pro Sitzung in Ordnung ist, wenn Sie keine anderen Schwachstellen auf Ihrer Website haben. Es gibt keinen Grund, warum Sie unbedingt ein neues CSRF-Token pro Anfrage generieren müssen.
Dies wird durch die Tatsache belegt, dass Sie auch seriöse Sicherheitsexperten finden, die dies für sinnvoll halten Um sich gegen CSRF zu verteidigen, verwenden Sie die doppelte Übermittlung von Cookies. Mit anderen Worten, Sie verwenden clientseitiges Javascript, das einen Hash des Sitzungscookies berechnet und diesen zu jeder POST-Anforderung hinzufügt und den Hash als CSRF-Token behandelt. Sie können sehen, dass dies im Wesentlichen im laufenden Betrieb ein CSRF-Token generiert, das für die gesamte Sitzung gleich ist.
Natürlich kenne ich das Argument, warum manche Leute empfehlen könnten, für jede Anfrage ein neues CSRF-Token zu generieren. Sie denken, wenn Sie auch eine XSS-Sicherheitsanfälligkeit auf Ihrer Website haben, ist es bei Verwendung eines einzelnen CSRF-Tokens pro Sitzung einfach, XSS zum Wiederherstellen des CSRF-Tokens zu verwenden. Wenn Sie jedoch pro Anforderung ein neues CSRF-Token generieren, ist dies der Fall wird mehr Arbeit erfordern, um das CSRF-Token wiederherzustellen. Persönlich finde ich das kein schrecklich überzeugendes Argument. Wenn Ihre Site eine XSS-Sicherheitsanfälligkeit aufweist, können CSRF-Token auch dann wiederhergestellt werden, wenn Sie für jede Anforderung ein neues CSRF-Token generieren. Es sind nur ein paar zusätzliche Zeilen schädlichen Javascript erforderlich. In beiden Fällen ist es schwierig, die Sicherheit zu gewährleisten, wenn Sie eine XSS-Sicherheitsanfälligkeit auf Ihrer Website haben und einem ernsthaften, sachkundigen Angreifer ausgesetzt sind, unabhängig davon, wie Sie Ihre CSRF-Token generieren.
Insgesamt kann dies nicht schaden um für jede Anfrage ein neues CSRF-Token zu generieren. Und vielleicht ist es besser, es so zu machen, nur um Sicherheitsprüfer von Ihrem Rücken zu bekommen. Wenn Sie jedoch bereits eine Legacy-Anwendung haben, die ein einzelnes CSRF-Token für die gesamte Sitzung verwendet, würde das Ausgeben des Geldes für die Konvertierung zur Generierung eines neuen CSRF-Tokens für jede Anforderung wahrscheinlich nicht ganz oben auf meiner Prioritätenliste stehen: Ich wette, ich könnte einige andere Verwendungszwecke für dieses Geld und die Entwicklerenergie finden, die die Sicherheit noch weiter verbessern würden.