Beiträge von JR Cologne

    Für gewöhnlich kommt der "CSRF-Check" vor der Verarbeitung des Formulars. Wozu überprüfen, ob das Formular abgesendet wurde, wenn es sich eh um einen Zugriff von außen handelt? Dann kann man sich das gleich sparen.


    Aber gut, das sind Kleinigkeiten, die hier jetzt kein Thema sind.

    Jo, Du hast recht, ich habe mich verlesen.

    Aber auch das wäre genau genommen überflüssig, weil bei einem leeren $_POST['csrf_token'] das hash_equals() auch false liefern würde.

    Ja, allerdings würde man dann immer eine Notice: Undefined Index bekommen.


    selection Du musst natürlich auch den Namen deines Formularfeldes mit dem Token entsprechend anpassen.

    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.

    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.

    Wie schon gesagt wurde, sollte man wegen der DSGVO nicht sofort in Panik verfallen.


    In die Mangel genommen werden eh erst die größeren Unternehmen und außerdem waren unsere Datenschutzgesetze auch schon vor der DSGVO relativ streng, wenn man das mal mit anderen europäischen Ländern vergleicht.


    Komplett ignorieren sollte man das Thema aber nicht. Dementsprechend habe ich mich die letzten Tage u.a. verstärkt damit auseinandergesetzt und bin zu folgenden Erkenntnissen/Schlussfolgerungen gekommen:


    1. Eine Überarbeitung der Datenschutzerklärung ist höchstwahrscheinlich angebracht und es gibt durchaus schon die eine oder andere Vorlage für eine DSGVO-konforme Datenschutzerklärung:

    https://datenschutz-generator.de,

    https://www.activemind.de/date…nschutzhinweis-generator/


    2. Wer einen praxisorientierten Überblick über die DSGVO braucht, kann den z.B. hier finden:

    https://www.selbstaendig-im-ne…-personenbezogener-daten/


    3. Zu den wichtigsten Dingen, die man nun beachten sollte, gehört meiner Meinung nach aber nicht nur die Datenschutzerklärung, sondern auch ein Verzeichnis der Verarbeitungstätigkeiten und die technischen und organisatorischen Maßnahmen, kurz: die Dokumentation des Datenschutzes.


    4. Jede einzelne Datenverarbeitung sollte in gewisser Weise eine Rechtfertigung haben, welche man dann auch im o.g. Verzeichnis aufführt. Man muss sich also Gedanken machen, wie man z.B. das Speichern von gewissen Nutzerdaten o.ä. begründet. Findet man keine gute Begründung, braucht man eine aktive Genehmigung des Nutzers.


    5. Cookie-Banner müssen wahrscheinlich weiter gesetzt werden, wenn Cookies genutzt werden.


    6. ADV-Verträge auch mit dem Hoster abschließen, nicht nur z.B. Google Analytics.


    usw...


    Es gibt also schon ein paar Sachen, die man nun vielleicht etwas genauer betrachten sollte.

    Hm, komisch.


    Bist du ganz sicher, dass du alles richtig gemacht hast? Vielleicht ist in deinem Code ja doch ein Fehler.


    Ansonsten könnte es natürlich auch ein Bootstrap-Bug sein, wobei das eher unwahrscheinlich ist.


    Wenn du willst, dass wir mal drüber gucken, einfach den entsprechenden Code hier posten.

    Kann man, glaube ich, grob so sagen.


    Habe selber noch nie damit gearbeitet. Cotton wird da sicher mehr zu sagen können.


    Bin lediglich mal darauf gestoßen und wusste dementsprechend, dass es zumindest nichts mit Geldgeschäften zu tun hat. :D

    Ok, das wusste ich nicht. Macht aber Sinn.


    Habe das Ganze jetzt so geändert, dass ich nicht das Value direkt setze, sondern nur meine Settings ändere und diese dann in die redraw()-Funktion einführe.


    Das sollte doch eigentlich das von dir angesprochene Problem beheben? Eine Änderung bzgl. des Verschiebens hat es auf alle Fälle leider nicht gebracht.


    Vielen Dank für deine Mühe. Wäre alleine komplett aufgeschmissen. :D