Dieser wikiHow zeigt Ihnen, wie Sie einen CSRF-Angriff (Cross Site Request Forgery) in einer PHP-Webanwendung verhindern können, indem Sie bei jeder Anfrage ein zufälliges Token einfügen oder für jedes Formularfeld einen zufälligen Namen verwenden. Bei einem Cross Site Request Forgery-Angriff (CSRF-Angriff) wird eine Webanwendungsanfälligkeit ausgenutzt, bei der das Opfer unbeabsichtigt in seinem Browser ein Skript ausführt, das die angemeldete Sitzung für eine bestimmte Site nutzt. CSRF-Angriffe können über GET- oder POST-Anfragen durchgeführt werden.

Teil eins von fünf:
Überblick über Methoden

Wir werden zwei Methoden verwenden, um CSRF-Angriffe auf Ihre GET- und POST-Anfragen zu verhindern:

  1. 1 Einschließlich eines zufälligen Tokens mit jeder Anfrage. Dies ist eine eindeutige Zeichenfolge, die für jede Sitzung generiert wird. Wir erzeugen das Token und fügen es dann in jeder Form als versteckte Eingabe hinzu. Das System prüft dann, ob das Formular gültig ist, indem es das Token mit dem Token vergleicht, das in der Sitzungsvariablen des Benutzers gespeichert ist. Ein Angreifer kann keine Anforderung generieren, ohne den Token-Wert zu kennen.
  2. 2 Verwenden eines zufälligen Namens für jedes Formularfeld Der Wert des zufälligen Namens für jedes Feld wird in einer Sitzungsvariablen gespeichert. Nachdem das Formular abgeschickt wurde, generiert das System einen neuen Zufallswert. Um erfolgreich zu sein, müsste ein Angreifer diese zufälligen Formnamen erraten.
    • Zum Beispiel eine Anfrage, die einmal so aussah:
    • Wird jetzt so aussehen:

Teil Zwei von Fünf:
Erstellen der CSRF-Klassendatei

  1. 1 Erstellen csrf.class.php. Dies ist die Datei, die alle Funktionen enthält, mit denen CSRF-Angriffe verhindert werden.
     <? php Klasse csrf  
  2. 2 Speicher die Datei.
    • Der gesamte Code in Teil 2 und 3 wird am Ende dieser Datei hinzugefügt.

Teil Drei von Fünf:
Zufälliges Token hinzufügen

  1. 1 Erstelle das get_token_id () Funktion. Diese Funktion ruft die Token-ID aus der Sitzung eines Benutzers ab. Wenn noch keine erstellt wurde, wird ein zufälliges Token generiert.
     Öffentlichkeit Funktion get_token_id()  ob(isset($ _SESSION['Token-ID']))  Rückkehr $ _SESSION['Token-ID'];  sonst  $ Token-ID = $ das->zufällig(10); $ _SESSION['Token-ID'] = $ Token-ID; Rückkehr $ Token-ID;   
  2. 2 Erstelle das bekomme Token() Funktion. Diese Funktion ruft den Token-Wert ab oder generiert einen Token-Wert, falls noch keiner generiert wurde.
     Öffentlichkeit Funktion bekomme Token()  ob(isset($ _SESSION['Token-Wert']))  Rückkehr $ _SESSION['Token-Wert'];  sonst  $ Token = Hash("sha256", $ das->zufällig(500)); $ _SESSION['Token-Wert'] = $ Token; Rückkehr $ Token;   
  3. 3 Erstelle das check_valid () Funktion. Diese Funktion bestimmt, ob die Token-ID und der Token-Wert beide gültig sind. Dies geschieht, indem die Werte der GET- oder POST-Anforderung anhand der in der SESSION-Variablen des Benutzers gespeicherten Werte überprüft werden.
     Öffentlichkeit Funktion check_valid($ Methode)  ob($ Methode == 'Post' || $ Methode == 'bekommen')  $ Beitrag = $ _POST; $ erhalten = $ _GET; ob(isset($$ Methode[$ das->get_token_id()]) && ($$ Methode[$ das->get_token_id()] == $ das->bekomme Token()))  Rückkehr wahr;  sonst  Rückkehr falsch;   sonst  Rückkehr falsch;   

Teil vier von fünf:
Generieren eines zufälligen Namens für jedes Formularfeld

  1. 1 Erstelle das form_names () Funktion. Diese Funktion generiert zufällige Namen für die Formularfelder.
     Öffentlichkeit Funktion form_name($ Namen, $ regenerieren)  $ Werte = Array(); für jede ($ Namen wie $ n)  ob($ regenerieren == wahr)  nicht gesetzt($ _SESSION[$ n]);  $ s = isset($ _SESSION[$ n]) ? $ _SESSION[$ n] : $ das->zufällig(10); $ _SESSION[$ n] = $ s; $ Werte[$ n] = $ s;  Rückkehr $ Werte;  
  2. 2 Erstelle das zufällig Funktion. Diese Funktion erzeugt eine zufällige Zeichenfolge, die die Linux-Zufallsdatei verwendet, um mehr Entropie zu erzeugen.
     Privatgelände Funktion zufällig($ len)  ob (function_exists('openssl_random_pseudo_bytes'))  $ byteLen = intval(($ len / 2) + 1); $ zurückgeben = Teilstr(bin2hex(openssl_random_pseudo_bytes($ byteLen)), 0, $ len);  sonst (@is_readable("/ dev / urandom"))  $ f=fopen("/ dev / urandom", 'r'); $ urandom=Freud($ f, $ len); schließen($ f); $ zurückgeben = ";  ob (leer($ zurückgeben))  zum ($ i=0;$ i<$ len;++$ i)  ob (!isset($ urandom))  ob ($ i%2==0)  mt_srand(Zeit()%2147 * 1000000 + (doppelt)Mikrozeit() * 1000000);  $ Rand=48+mt_rand()%64;  sonst  $ Rand=48+ord($ urandom[$ i])%64;  ob ($ Rand>57) $ Rand+=7; ob ($ Rand>90) $ Rand+=6; ob ($ Rand==123) $ Rand=52; ob ($ Rand==124) $ Rand=53; $ zurückgeben.=Chr($ Rand);   Rückkehr $ zurückgeben;  
  3. 3 Schließen Sie die Klasse csrf Klammer.
      
  4. 4Schließe csrf.class.php Datei.

Teil fünf von fünf:
Verwenden der CSRF-Klassendatei

  1. 1 Fügen Sie die CSRF-Klassendatei einem POST-Formular hinzu. Der hier abgebildete Code zeigt Ihnen, wie Sie die CSRF-Klassendatei zu einem POST-Formular hinzufügen, um einen CSRF-Angriff zu verhindern.
     <? php session_start(); einschließen 'csrf.class.php'; $ csrf = Neu csrf(); // Erzeuge Token-Id und Gültig $ Token-ID = $ csrf->get_token_id(); $ Token_Wert = $ csrf->bekomme Token($ Token-ID); // Erzeuge zufällige Formnamen $ Formular_Name = $ csrf->form_name(Array('Benutzer', 'Passwort'), falsch); ob(isset($ _POST[$ Formular_Name['Benutzer']], $ _POST[$ Formular_Name['Passwort']]))  // Überprüfen Sie, ob die Token-ID und der Token-Wert gültig sind. ob($ csrf->check_valid('Post'))  // Erhalte die Formularvariablen. $ Benutzer = $ _POST[$ Formular_Name['Benutzer']]; $ Passwort = $ _POST[$ Formular_Name['Passwort']]; // Form-Funktion geht hierhin  // Generiere einen neuen Zufallswert für das Formular. $ Formular_Name = $ csrf->form_name(Array('Benutzer', 'Passwort'), wahr);  ?>