Codeigniter ajax CSRF-Problem

7

Ich habe eine einfache Autoload-Funktion erstellt, die Inhalte lädt, wenn Sie auf einer Website nach unten scrollen. Es scheint jedoch ein paar Probleme zu geben, wenn ich CSRF-Schutz in Codeigniter aktivieren.

Ich verwende kein Formular, daher weiß ich nicht, wie ich das Token von A nach B senden kann, wenn ich beim Scrollen meine Post-Anfrage mache.

Mein JavaScript

%Vor%

Da Codeigniter bei allen POST-Anfragen ein TOKEN erwartet, kann ich dies nicht ausführen, wenn CSRF aktiviert ist. Irgendwelche Vorschläge?

Fehler, wenn CSRF aktiviert ist

  

Laden der Ressource fehlgeschlagen: Der Server hat mit dem Status 500 (Interner Serverfehler)

geantwortet

Wenn ich CSRF ausschalte, funktioniert alles super ...

    
Dexty 08.09.2011, 12:56
quelle

7 Antworten

12

Wie andere sagen - Sie müssen den CSFR-Token-Namen und seinen Wert mit den AJAX-Anforderungsparametern posten. Hier ist eine einfache Lösung, um es automatisch an jede AJAX-Anfrage anzuhängen.

Hier ist, was ich auf meine Hauptansicht gesetzt habe, also ist dieser Code auf jeder Seite vor dem Laden der anderen Javascript-Dateien:

%Vor%

Und hier ist ein Teil einer JavaScript-Datei, die ich auf jeder Seite einschließe:

%Vor%     
georgiar 22.04.2013 05:29
quelle
12

Vielleicht möchten Sie diesen Code ausprobieren, den ich benutzt habe. Es funktioniert super:

%Vor%     
imsyedahmed 05.06.2012 12:11
quelle
10

Wenn Sie möchten, können Sie sowohl den Token-Namen als auch den Hash-Code an einer geeigneten Stelle ausgeben. So etwas.

%Vor%

und

%Vor%

Oder Sie könnten form_open () wie gewohnt verwenden und die versteckte Eingabe verwenden, die von Ihrem Javascript generiert wird. Das Deaktivieren der CSRF-Funktionalität ist der falsche Weg.

    
Tobias 08.09.2011 14:08
quelle
0

Grundsätzlich müssen Sie den erwarteten csrf-Wert vom Cookie erhalten (standardmäßig 'ci_csrf_token' genannt) und ihn dann zusammen mit Ihren anderen Daten veröffentlichen.

Sie müssten diese Zeile ändern:

%Vor%

zu:

%Vor%

Muss das Cookie-Addon installieren (ich bin mir nicht wirklich sicher; ich benutze mootools). Hier finden Sie weitere Informationen: Ссылка .

    
Osan 25.01.2012 17:42
quelle
0

Vorherige Vorschläge funktionieren großartig, aber anstatt eine Variable zu verwenden, die Sie in jedem Daten-Post anwenden können, finde ich es einfacher, die Ajax-Einstellung zu verwenden, um dieses Token automatisch auf jeden Post anzuwenden:

%Vor%

(funktioniert mit jquery-1.9.1. Ich bin mir nicht sicher über andere jquery-Versionen)

    
Kevin Driessen 21.12.2014 15:22
quelle
0

Das einzige Problem mit einigen der obigen Antworten ist, dass ein csrf-Token nur für eine Anfrage gültig ist. Wenn Sie also eine Post-Anfrage über Ajax machen und die Seite nicht aktualisieren, haben Sie nicht das aktuelle csrf-Token für Ihre nächste Ajax Post Anfrage. Das ist meine Lösung:

In Ihrem CodeIgniter-Controller:

%Vor%

$ data = die Daten, die an den Browser zurückgegeben werden sollen

$ csrf = neues csrf-Token, das vom Browser für die nächste Ajax-Post-Anforderung verwendet werden soll

Offensichtlich können Sie dies auf andere Weise ausgeben, aber JSON wird hauptsächlich bei Ajax-Aufrufen verwendet. Fügen Sie dieses Token auch in jede Post-Antwort ein, die für die nächste Post-Anfrage verwendet werden soll

Dann in Ihrer nächsten Ajax-Anfrage (Javascript):

%Vor%

Denken Sie auch daran, wo ich csrf_token:token replace crf_token mit dem Namen Ihres Tokens in der Datei application / config / config.php in Zeile $config['csrf_token_name'] = 'csrf_token';

gefunden habe     
OGZStudio 10.06.2016 22:15
quelle
0

Nachdem ich meine Situation überprüft habe, glaube ich, dass es die beste Option ist, CSRF zu verwenden, aber das Token bei jedem Versuch zurückzusetzen . Andernfalls würden die zuvor geäußerten Ideen zur Wiederverwendung des Cookie-Tokens einem Angreifer ermöglichen, Daten Hunderte Male erneut zu übermitteln, wobei dasselbe Token verwendet wird, das das Objekt des Punktes besiegt.

Als solche habe ich die folgende Funktion erstellt:

%Vor%

Wenn zum Beispiel ein Ajax-basiertes Anmeldeformular fehlschlägt - rufen Sie diese Funktion in Ihrem PHP und dann auf der JavaScript-Seite auf, die den Fehler empfängt (diese Lösung verwendet Jquery und eine getCookie-Funktion von w3schools) würde dann einfach aufrufen:

$('input[name="csrf_test_name"]').val(getCookie('csrf_cookie_name'));

    
Antony 01.09.2017 08:10
quelle

Tags und Links