2016-07-07 17 views
1

Im Moment habe ich diese 2 Funktionen, ein für Token zu erzeugen und eine für die Prüfung der Gültigkeit:Ist es sicher, das CSRF-Token auf derselben Seite wie das gesicherte Formular zu generieren?

function getToken() { 
    if(isset($_SESSION['token'])) { 
     return $_SESSION['token']; 
    } else { 
     $token = //random key generator goes here; 
     $_SESSION['token'] = $token; 
     return $token; 
    } 
} 

function validateToken($token) { 
    if ($token == getToken()){ 
     return true; 
    } else { 
     return false; 
    } 
} 

Und mein Anmeldeformular enthält diesen versteckten Eingang:

<input type="hidden" name="token" value="<?php echo getToken(); ?>"> 

dies sicher ist? Ich frage, weil, was, wenn Sitzung des legitimen Benutzers abläuft und sie CSRF'd zu diesem Registerformular erhalten und Token wird durch die schädliche Site/iframe selbst erzeugt, weil man nicht bereits in der Sitzung existierte, also gerade gut authentisieren?

Angenommen, der Benutzer bleibt wegen Cookies angemeldet.

Versteh ich die Dinge hier falsch? Kann Remote-Linking wie Iframes keine Sitzungen in Ihrem Backend generieren?

+0

Und ... Sitzungen sind weniger sicher als das, weil ...? – Machavity

+0

@Machavity Entschuldigung, ich verstehe nicht, was Sie sagen wollen. Alles, was ich frage, ist, ob meine Vorgehensweise sicher wäre, weil ich mir vorstelle, das Token auf derselben Seite zu generieren, auf der das Formular irgendwie den Zweck vereitelt, nicht wahr? –

+0

"das Token auf der gleichen Seite wie das Formular generieren" --- Was bedeutet das? CSRF-Token muss unmöglich zu erraten sein. Das ist die einzige Voraussetzung dafür. – zerkms

Antwort

0

Nein. Soweit ich das beurteilen kann, machen Sie es richtig, da der Token generiert werden sollte, sobald der Benutzer auf die Formularseite kommt. Dann generieren Sie es, um sicher zu sein, dass jemand (echter Benutzer) Ihr Formular tatsächlich besucht hat und Sie dann das Token für sie setzen.

Wenn sie eine Aktion mit dem Formular ausführen, überprüfen Sie mit dem Token, ob das Token für diesen Benutzer gültig ist. Also, ich denke du machst es richtig.

Eine Sache, generieren Sie das Token und speichern Sie es in Sitzung, wenn ein Benutzer anfordert/kommt auf die Formularseite. Es wäre besser, wenn Sie es jedes Mal generieren, wenn eine Anfrage kommt. Löschen Sie dann nach jeder erfolgreichen Formularübergabe das markierte Token aus der Sitzung.

+0

"Es wäre besser, wenn Sie es jedes Mal generieren, wenn eine Anfrage kommt." --- Es wäre sicherlich schmerzhaft, aber aus Sicherheitsgründen ist nicht klar, warum es "besser" sein sollte. – zerkms

+0

Es würde helfen, Session-Hijacking zu verhindern, da die Sitzung das Token für eine kürzere Zeit speichern wird. –

+0

Wenn Sie eine Sitzung gestohlen haben - wie relevant ist es für CSRF? Sie haben eine Session-ID - Sie gehen auf die Seite und führen eine Anfrage mit einem gerade generierten Token aus. – zerkms