Aktuelle MySql Daten werden nach refresh nicht angezeigt

  • Ich habe ein Loginscript , wo ich eine profilseite habe wo man seine daten ändern kann (Benutzername, Persönliche Nachricht)

    Wenn ich die daten ändere und ich die seite neu lade wird immer noch die alte Nachricht angezeigt


    Kann mir einer helfen?



    Das Formular:



    Das includete php script:


  • Siehe comments:

    PHP
    1. if ( $mysqli->query($sql) ) {
    2. // ...
    3. } else {
    4. // hier $mysqli->error nutzen, um fehler mitzubekommen
    5. // siehe http://php.net/manual/de/mysqli.error.php#refsect1-mysqli.error-examples
    6. }

    Evtl gibts nen Fehler, den Du nicht ausgibst.


    Achtung: SQL-Injection möglich.

    Verwende PLatzhalter (->prepare(".... where email = ?")) und NICHT variablen direkt in der Query!

    Siehe: http://php.net/manual/de/mysql…1-mysqli.prepare-examples

  • Es kommt kein Fehler wenn ich $mysqli - >errror benutze

    Es funktioniert aber wenn ich mich neu einlogge

    Ber ich will es ohne neu einloggen

    Kannst du das bitte mit dem prepare erklären?

  • Du hast hier folgendes gepostet:


    Zitat

    Es kommt kein Fehler wenn ich $mysqli - >errror benutze

    Es funktioniert aber wenn ich mich neu einlogge

    Ber ich will es ohne neu einloggen


    Kannst du das bitte mit dem prepare erklären?


    Wo brauchst du Hilfe? Und zeige den gesamten Code her, der dein Problem betrifft bitte.


    Zu deiner Frage "Kannst du das bitte mit dem prepare erklären?":


    Dein Code hat kritische Sicherheitslücken. Du fügst die Variable einfach so in die Query ein. Nun kann jemand von außerhalb, welcher das Formular absendet, die Absicht haben eine SQL-Injection (siehe Link) durchzuführen dann kommt er an deine ganzen Daten dran.


    Beispiel du hast eine DR-Abfrage. Nun trägst du die Variable einfach in die Query ein. Nun kann der User hergehen und die Suchabfrage ändern.


    Nehmen wir an deine Query ist : "UPDATE users SET password = $password WHERE userId = $userId"


    Nun kann der fremde User wenn du dich nicht gegen SQL-Injections schützt die Abfrage ändern und so an die ganzen Daten drankommen.

    Die Abfrage würde nach der SQL-Injection dann so aussehen:


    "UPDATE users SET password = $password WHERE userId = $userId or permissions LIKE '%admin%' ".


    Nun wird das Password, wenn die Spalte permissions vorhanden ist und ein Wert welcher Ähnlichkeiten mit dem Suchwort admin hat, zu seinem Wunschpassword geändert. Somit hat er Zugriff zu einem Account eines Admins und kommt an sehr geschützte Daten dran wie z.b. Nachrichtenzentrale, villt. werden im Backend auch alle Daten aus der Tabelle users ausgegeben in einer Tabelle. Dann hätte der Angreifer alle Daten.


    Verhindern kannst du es mit Prepared Statements.


    Bei diesen bereitest du eine query mit der function prepare() und platzhalten ( ? oder :platzhalter) vor. Nun führst du diese vorbereitete Query mit der execute function aus und bei dieser werden den Platzhaltern die entsprechenden Werte zugeteilt.

  • Das geht schon beim select los:

    "SELECT * FROM users WHERE email='$email'"

    Wenn $email, was ja über $_POST reinkommt, jetzt den Inhalt

    ' OR id = 1; -- x

    hat, dann wird diese Query daraus;

    SELECT * FROM users WHERE email='' OR id = 1; -- x'

    Und id 1 könnte ja schon mal der admin sein :)



    BTW: ich sehe gerade, dass Du die SELECT-Query abschickst, BEVOR Du $email definierst:

    PHP
    1. // hier feuerst du die query ab:    
    2. $result = $mysqli->query("SELECT * FROM users WHERE email='$email'");
    3. $first_name = $_POST['firstname'];
    4. $last_name = $_POST['lastname'];
    5. // aber HIER definierst du $email erst
    6. $email = $_SESSION['email'];

    Das heißt, Du suchst nach einer email "".


    So rum sollte es laufen:

  • Für die Anzeige ist dann ein anderes Statement notwendig.


    Du selektierst die Daten aus der DB. Holst diese dann heraus und zeigst diese so wie du es haben willst an


    Zitat

    Und wie kann ich es mit prepare umsetzen

    Etwa so?


    prepare("UPDATE users SET first_name='$first_name', last_name='$last_name', about_you_private='$about_you_private' WHERE email='?'")


    Nein. In einer Query haben variablen nix zu suchen. So könnte er trotzdem eine Injection ausführen. Anstatt was einzugeben, kann er nun alles auf leerstring setzen oder ein paar Buchstaben reinschreiben und dann absenden.


    Eine Query nach Prepared Statement sieht so aus:


  • Danke ich werde es versuchen


    Muss ich in der Profile.php auch was ändern?


  • Was sind die Variablen $stmt und was ist $city ?

  • Hey,


    Zitat


    Muss ich in der Profile.php auch was ändern?

    Ja! Aufjedenfall. Diese Seite darf so niemals online gehen. Du nimmst die Eingabe des Users und speicherst diese ungefiltert in eine Session. Das ist nicht das Problem. Aber wenn du diese dann ohne Beachtung des Kontextwechsels und der Maskierungen ausgibst dann wird der schädliche Code ausgeführt. Darüberhinaus hast du da auch eine SQL-Injection-Stelle drin.


    Bei XSS-Angriffen über das Formular ist der Post, der von außen kommt, erst dann schädlich wenn man diesen ohne Umwandlung ausgiebt. Denn man führt bei der Ausgabe diesen Code aus. Man muss ebenso generell davon ausgehen, dass die Usereingabe potentiell gefährlich ist und das auch in der Datenbank potentiell gefährliche Daten liegen können.


    Darüberhinaus benutzt du beim Formular POST. Das heißt die abgesendeten Daten des Formulars sind nur in diese POST-Kanal drin.


    Wenn du es mit PDO machst und die Eingaben, welche du durch das Formular erhälst, so behandelst wie ich es oben erwähnt habe würde das ganze so aussehen:


    main.php:


  • Das sollte es sein, wenn ich mich nicht vertippt hab :)

  • Hey,


    schau mal hier http://stef97.bplaced.net/status/ . Da habe ich mal für diesen Zweck alles programmiert von Registration bis Registration abschließen, login und eine eigene Page für jeden User. Bei der Registration wird dem jenigen eine E-Mail gesendet und in dieser ist ein Bestätigungslink zur Aktivierung der Registration vorhanden. Bevor der User diesen Link nicht bestätigt hat, kann er sich nicht anmelden. Zum Mailversand wird der PHP-Mailer verwendet.

    Das einzigste Problem welches ich immer habe ist, dass der Inhalt aus der DB erst nach dem 2ten laden angezeigt wird. Ich frage mich warum das so ist. cottton : Villt. weißt du warum, es tritt bei der user.php auf.


    Der Code dazu:


    registration.php

    registrationLock.php