it-swarm.com.de

Benötige ich ein CSRF-Token für jQuery .ajax ()?

Ich habe also eine grundlegende .ajax () POST -Methode zu einer PHP -Datei.

Welche Sicherheitsmaßnahmen brauche ich?

In einigen Beiträgen wurde erwähnt, dass ein verstecktes MD5-Eingabefeld verwendet wurde, das Sie über AJAX senden und in der PHP -Datei überprüfen. Ist das eine gute Methode?

26
Nathan Waters

Das Risiko von CSRF besteht darin, dass eine externe Site Daten an Sie senden kann und der Browser des Benutzers automatisch das Authentifizierungs-Cookie mitsendet.

Was Sie brauchen, ist eine Möglichkeit für die Empfangsaktion (an die Ihre $.ajax()-Methode POST -Daten sendet), um zu überprüfen, ob die Anforderung von einer anderen Seite Ihrer Site als von einer externen Site stammt.

Es gibt mehrere Möglichkeiten, dies zu tun, aber es wird empfohlen, der Anforderung ein Token hinzuzufügen, auf das Sie prüfen können und zu dem die Hacker nicht gelangen können.

Am einfachsten:

  • Erstellen Sie bei der Anmeldung ein langes zufälliges Zeichenfolgen-Token und speichern Sie es für den Benutzer.
  • Fügen Sie der $.ajax()-Anforderung einen Parameter hinzu, der das Token enthält.
  • Überprüfen Sie auf Anfrage, ob das Token mit dem für den Benutzer gespeicherten übereinstimmt.
  • Wenn das Token nicht übereinstimmt, haben Sie einen CSRF-Hack.

Der Hacker kann nicht in die Datenbank gelangen und kann die Seite, die Sie an den Benutzer gesendet haben, tatsächlich nicht lesen (es sei denn, er erhält einen XSS-Angriff, aber das ist ein anderes Problem). Daher kann er das Token nicht fälschen.

Alles, was mit dem Token wichtig ist, ist, dass Sie können es vorhersagen (und validieren) und dass der Hacker nicht

Aus diesem Grund ist es am einfachsten, etwas Langes und Zufälliges zu generieren und in der DB zu speichern, aber Sie könnten stattdessen etwas verschlüsselt aufbauen. Ich würde allerdings nicht nur den Benutzernamen MD5 angeben - wenn die CSRF-Angreifer herausfinden, wie sie ihre Token generieren, werden Sie gehackt.

Das Token kann auch in einem Cookie (und nicht in Ihrer Datenbank) gespeichert werden, da die Angreifer Ihre Cookies nicht lesen oder ändern können, sondern nur erneut gesendet werden. Dann sind Sie das Token im HTTP POST, das mit dem Token im Cookie übereinstimmt.

Sie können diese wesentlich komplexer gestalten, beispielsweise ein Token, das sich bei jeder erfolgreichen Verwendung ändert (Wiedervorlage verhindern) oder ein Token, das für den Benutzer und die Aktion spezifisch ist. Dies ist jedoch das grundlegende Muster.

35
Keith

In Bezug auf die Anfragefälschung spielt es keine Rolle, wie der Client die Anfrage sendet, und es ist wichtig, wie er empfangen wurde. Für eine Ajax-Stelle gelten die gleichen CSRF-Regeln wie für jede andere Art von Stellen. 

Ich empfehle, das CSRF Prevention-Datenblatt zu lesen. Die Verwendung eines geheimen Token pro Benutzer ist die häufigste Form des Schutzes.

2
rook

Hier ist eine einfache Demo, die Sie mit Django ausprobieren können:

Auf HTML-Seite

{%block content%}
<form id="userForm">
{%csrf_token%}
  <input type="text" id="username" placeholder="User Name">
  <input type="password" id="password" placeholder="Password">
</form>
{%endblock%}

Java-Skriptcode

%(document).on('submit','#userForm',function(e){
   e.preventDefault();

 $.ajax({

    type = 'POST',

    url:'path/to/url',

    data:{
     username:$('#username').val(),
     password:$('#password').val(),
     csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken').val()
    },

   success:function(data){
       alert('Successfull');
   }
  });

});
0
user7032676

Es ist kein Token erforderlich, Sie sollten jedoch alle Funktionen, die den Status ändern, gegen CSRF schützen.

Eine einfache Möglichkeit besteht darin, einen Header hinzuzufügen, der mit der Anforderung AJAX gesendet wird. Es wird kein zufälliges Token benötigt.

Das funktioniert aus folgenden Gründen:

  • Für HTML-Formulare können keine benutzerdefinierten Header von einem Angreifer hinzugefügt werden.
  • Benutzerdefinierte Header können nicht domänenübergreifend übergeben werden, wenn CORS nicht aktiviert ist.

Natürlich muss der serverseitige Code sicherstellen, dass der Header vorhanden ist, bevor er seine Aktion ausführt.

Weitere Informationen: Wozu dient der X-Requested-With-Header?

0
SilverlightFox