Token via Javascript

  • Tag,


    aus PHP kennt man den Sicherheitstoken z.b mit einer 16 stelligen Zufallszahl. Die wird als Session gespeichert und bei jedem POST überprüft ob der Token mit dem $_SESSION['token'] übereinstimmt. Wie mache ich das aber Via Javascript?


    Nehmen wir mal an ich habe ein einfaches Script:


    PHP:

    data.php

    index.php

    Wie kann ich hier z.b ein Token einfügen?

  • javascript hat wohl sowas wie session id nicht.

    Lass dir doch vorher eine id von php geben

    mit type=hidden schickst du es mit dein ajax zurück

    PHP
    1. <?php $session = md5(microtime()); ?>
    2. <input type="hidden" name="session" value="<?php echo $session; ?>">

    So würde ich es machen,aber ist bestimmt ne sch... idee

  • selection Erklär bitte mal genauer, was du vorhast. Sehe aktuell noch nicht wirklich den Sinn hinter deinem Vorhaben.


    https://www.php-einfach.de/exp…ite-request-forgery-csrf/


    Dieses Verfahren in Javascript. Soll halt ein CSRF Schutz sein sobald man das POST-Verfahren anwendet. (Oder halt das GET verfahren)


    Ich könnte es so wie Basti es beschrieben hat machen, problem seht ihr aber dann hier im Video:




    Zu meinem Skript im Video:

    Bei jedem eingegebenen Buchstaben zeigt er mir alle User an mit den folgenden Suchbegriff den ich eintippe.


    Wenn ich jetzt ein Buchstabe eingebe erscheint ja das Post-Verfahren. Sollte ich jedoch einen weiteren Buchstaben eingeben steht da ungültiger Token. Wenn ich es z.b wie oben mache mit einem INSERT, dann passiert das gleiche.



    token.php


    Data.php


    Index.php

  • Über Ajax wird die Session gehalten, bzw. bleibt diese bekannt.


    Das Vorhaben wird i.d.R. eigentlich alternativ zu Ajax mit einem lokalen JS-Array umgesetzt.

    Bei der Variante wird halt in dem Array nach Treffern gesucht.


    Die Ajax-Variante ist natürlich aber auch möglich. Man muss dann nur bedenken, dass für jede Treffersuche ein HTTP Request durchgeführt wird.

    Aber ein session_start() in der Ziel-PHP-Datei des Ajax-Request erkennt die Session und verfügt damit auch über alle darin enthaltenen Werte.

  • OK, aber warum mit JS?

    Weil es ja mit PHP nicht klappt bei mir, da steht ja immer ungültiger Token.




    Ich habe in der Ziel-PHP Datei "session_start();" angewendet. Aber das mit dem HTTP-Request ist mir jetzt neu.

  • Was genau ist Dir neu dabei? Ein Ajax-Request ist nichts anderes, wie ein "normaler" Request, nur dass er asynchron läuft, also im Hintergrund. Ein HTTP-Request bleibt es dennoch immer.

    Hab das dann falsch verstanden sorry.


    Aber was ist denn jetzt in meinem Skript falsch ? bzw wie sollte es aussehen dass er den Token jedes mal "übernimmt"


  • Mit JS musst du das erst gar nicht versuchen. Das ergibt keinen Sinn.


    Mit PHP sollte das perfekt funktionieren. Du hast mit Sicherheit irgendwo einen Fehler drin. Wäre gut, wenn du mal den kompletten Code zeigen würdest.


    Wichtig ist übrigens, dass du den Token in der data.php überprüfst. Ansonsten kann man einfach ein Post-Request mit den entsprechenden Daten an data.php schicken.

  • connect.php



    index.php


    show_user.php


    Ich habe jetzt paar Funktionen weggelassen weil sonst alles zu lang und übersichtlich wäre. Sind ja auch egal, es geht ja auch eig nur um den obigen SQL Code denk ich mal. Danke für die Hilfe möchte dir jetzt nicht große Umstände machen

  • hat wohl nix mit dein problem zu tun haben ,aber du hast bei show_user.php in Zeile 42 das stehen

    Code
    1. <span class="number-<?= $row['id']; ?>">

    müßte das nicht so heißen

    PHP
    1. <span class="number-<?php echo $row['id']; ?>">

    ??????

    wenn ich unrecht habe dann einfach hinüber weg lesen

  • Genau, das geht beides. Das ist einfach nur eine Kurzform.



    OK, habe das Problem entdeckt. Ist eigentlich logisch, muss man nur drauf kommen:


    1. Deine Seite index.php mit dem Formular usw. wird geladen. Da die Request-Methode GET ist, wird durch deine eingebundene Datei einfach der Token erstellt und in der Session gespeichert. Anschließend erfolgt die Ausgabe des Tokens im Formular.


    2. Du gibst etwas in dein Formular ein. Ein Ajax-Request wird abgesetzt, zusammen mit dem Token aus dem Formular.


    3. Die Seite show_user wird im Hintergrund geladen. Da die Request-Methode diesmal POST ist und der Token aus der Session mit dem Token aus dem Formular übereinstimmt, sollte nichts passieren bzw. der User ganz normal angezeigt werden.

    Dies geht aber nicht in Erfüllung, da das Setzen der Session außerhalb der if-Abfrage erfolgt. Es wird also immer ausgeführt. Folglich wurde nun der Token in Der Session geändert. Der User wird jedoch erstmal richtig ausgegeben.


    4. Du gibst auf der Seite index.php wieder etwas in das Formular ein. Beachte: Die Seite wurde nicht neu geladen. Der Token im Formular ist immer noch der vom Anfang. Der Ajax-Request wird also gesendet, aber noch mit dem alten Token.


    5. Wieder wird show_user.php im Hintergrund geladen. Das Ding: Der Token aus der Session stimmt nicht mit dem Token aus dem Formular überein. Die Folge ist dein angesprochener Fehler, dass ein ungültiger Token vermeldet wird.


    Eine mögliche Lösung (inkl. kleinen allgemeinen Verbesserungen):

    PHP
    1. <?php
    2. if (empty($_SESSION['csrf_token'])) {
    3. $_SESSION['csrf_token'] = bin2hex(random_bytes(16));
    4. } else {
    5. if (empty($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    6. die('Invalid CSRF Token!');
    7. }
    8. }
    9. }
    10. ?>


    Achtung: Code nicht getestet.

  • Du fragst:

    Code
    1. WENN csrf_token LEER IST {
    2. // do something
    3. } ANDERNFALLS {
    4. WENN csrf_token LEER IST ...
    5. }

    Das ist überflüssig, weil an der Stelle csfr_token nicht empty sein kann.

    Die Bedingung, die Du mit ODER rangehängt hast, kann hier auch alleine stehen.


    Evtl. kann man das auch ohne ELSE schreiben:

    Nach Verarbeitung des ersten IF kann csrf_token nicht mehr leer sein.


  • Ok super das Prinzip hab ich jetzt verstanden. Jedoch zeigt er mir immer Invalid CSRF Token an.


    Hab 2 Varianten ausprobiert:


    Connect.php


    Index.php


    Mit dieser Variante komm ich nichtmal auf meine Seite der beendet sofort alles und sagt ungültiger Token.



    Variante 2:


    Connect.php


    show_user.php


    So zeigt er mir wie im video jedes mal ungültiger Token