2011-01-07 10 views
3

Ich habe Janrain Open ID auf meiner Codigniter 2.0 Website implementiert. Es funktionierte großartig, bis ich CSRF-Schutz in meiner codeigniter Konfigurationsdatei aktivierte.Implementieren von CSRF in OpenID iframe

Ich lese darüber und es scheint, dass ich in allen meinen Formen auf meiner Website ein verstecktes Formularelement mit einem Token enthalten sollte, das dann gegen einen Cookie-Token verifiziert wird, nachdem der Beitrag von der Empfangsseite gelesen wurde.

Das ist alles gut und Dandy, aber wo ich ein bisschen feststecke ist, wenn ich versuche, mich in meine Website jetzt mit OpenID (von denen das Login-Formular stammt aus einem iframe, das auf janrain.com gehostet wird) einzuloggen kann keine versteckten Postwerte enthalten, da ich keine Kontrolle darüber habe, wie das Formular aussieht, und kann nur eine Rückgabe-URL angeben, so dass Janrain weiß, auf welcher Seite ich zurückkommen soll.

Wie kann ich meinen CSRF-Token mit dem Formular senden, wenn das Formular in einem Iframe ist, das ich nicht kontrolliere?

Antwort

1

Haben es gelöst. Am Ende habe ich dem iframe meine Rückgabe-URL gesendet, von der ich das CSRF-Token als Teil der URL eingefügt habe. Wenn Janrain zu meiner Rückkehr-URL zurückkehrt, während Codeigniter die Sicherheitsüberprüfung innerhalb von Security :: csrf_verify() durchläuft, überprüfe ich etwas gegen die URL, um zu sehen, ob meine Token übereinstimmen (leider konnte ich aus irgendeinem Grund keine CI-Bibliotheken verwenden) Also habe ich die URL selbst mit explode ('/', $ _SERVER [REQUEST_URI]) analysiert. Wenn ich eine Übereinstimmung in der URL zu meinem csrf-Cookie-Token finde, dann sind wir alle gut und ich überprüfe nicht die POST-Variablen, die Codigniter normalerweise tun würde.

0

Ich suchte auch Lösung, wie CSRF pro Controller zu deaktivieren. Ich habe es auf diese Weise:

if(stripos($_SERVER["REQUEST_URI"],'/controller') === FALSE) 
{ 
    $config['csrf_protection'] = TRUE; 
} 
else 
{ 
    $config['csrf_protection'] = FALSE; 
} 

in config.php Ich weiß nicht, ob es zuverlässig ist, aber es funktioniert für mich.

1

Sie können auch nur diese bis zum Ende Ihrer Token-URL hinzufügen:

?ci_csrf_token='.$this->security->get_csrf_hash() 

Also lassen Sie uns sagen, dass Sie für JanRain ein embeded iframe verwendet haben, würde der vollständige Code am Ende wie folgt suchen mit:

<iframe src="https://MYACCOUNT.rpxnow.com/openid/embed?token_url=<?PHP echo rawurlencode($token_url).'?ci_csrf_token='.$this->security->get_csrf_hash(); ?>" scrolling="no" frameborder="0" seamless="seamless" style="width:400px; height:240px;"></iframe> 

ich habe diese arbeiten groß auf meinem codeigniter, und Sie brauchen nicht Ihre CSRF Schutz zu deaktivieren :)