Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie kann ich einen Wert nach 30 Minuten zurücksetzen lassen?

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Wie kann ich einen Wert nach 30 Minuten zurücksetzen lassen?

    Hallo,
    ich bin dabei einen Login-Script zu schreiben, welcher gegen Bruteforcing geschützt sein soll.
    Dabei wird bei jedem falschen Login eine Variable, die dem Nutzernamen zugewiesen wurde inkrementiert.
    Ist diese >= 3, sollen alle weiteren Login-Versuche für 30 Minuten ignoriert werden.

    Den Wert bei falschen Logins zu inkrementieren funktioniert bereits. Ebenso, weitere Login-Versuche, wenn schon 3 unternommen wurden zu ignorieren.
    Nur verzweifle ich daran, einen Trigger oder ein Ereignis-Script zu erstellen, das nach 30 Minuten den Wert zurücksetzt.
    Die Tabelle hat folgende Struktur:
    username password login_time attempt_time login_attempts user_ID
    nutzername gehashtes pw letzter erfolgreiche login (timestamp) letzter login versuch (timestamp) anzal der login versuche ID (AI)
    Im Klartext:
    Wenn login_attempts > 0, dann soll nach 30 Minuten der Wert auf 0 zurückgesetzt werden.

    Danke


  • #2
    Speichere den Timestamp als DATETIME, wann die 3 Versuche erreicht wurden, resp. die Sperrung begonnen hat.
    Dann halt die Differenz zwischen gespeichertem Zeitwert und NOW prüfen.
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche Tutorials

    Kommentar


    • #3
      Anhand welcher Informationen willst Du denn entscheiden wer wer ist um überhaupt zu wissen wer wie oft versucht hat sich einzuloggen? Dazu gibt es m.W. keine zuverlässige Möglichkeit.
      PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

      Kommentar


      • #4
        Zitat von Ulfikado Beitrag anzeigen
        Anhand welcher Informationen willst Du denn entscheiden wer wer ist um überhaupt zu wissen wer wie oft versucht hat sich einzuloggen? Dazu gibt es m.W. keine zuverlässige Möglichkeit.
        Bei Brutforcing mach es wenig Sinn bei jedem Versuch Username und Passwort zu wechseln. ^^

        Zudem gibt es einen Haufen Tracking Methoden, welche zu umgehen allerdings für Hacker ein leichtes ist.
        Hacker finden aber auch andere Wege in Dein System.

        Kommentar


        • #5
          Zitat von Arne Drews Beitrag anzeigen
          Speichere den Timestamp als DATETIME, wann die 3 Versuche erreicht wurden, resp. die Sperrung begonnen hat.
          Dann halt die Differenz zwischen gespeichertem Zeitwert und NOW prüfen.
          Ok, habe alles so eingestellt.
          Aber so ganz funktioniert das nicht:
          Code:
          UPDATE `user` SET login_attempts=0
          WHERE login_attempts=3 AND attempt_time<NOW()-1800
          Ich kann überhaupt keinen Wert mehr in die Tabelle schreiben

          Kommentar


          • #6
            Aber so ganz funktioniert das nicht:
            Heißt was? Debugg es halt. Führe die Query auf der DB auf, passiert dort das korrekte ja/nein? Und weiter etc etc..

            Code:
             attempt_time<NOW()-1800
            Keine Ahung ob das funktonieren kann, NOW() liefert üblicherwiese sowas: 2018-02-01 08:25:12

            Kannst ja mal prüfen was ein SELECT NOW() - 1 as foo liefert.

            Ich glaub du suchst eher DATE_ADD() oder so. https://dev.mysql.com/doc/refman/5.5...functions.html


            EDIT:

            Code:
            SELECT NOW() - 1 as foo;  
            
            // 20180201082754
            PHP.de Wissenssammlung | Debugging: Finde DEINE Fehler selbst! | mysql_* ist veraltet! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__ | Kein Support per PN

            Kommentar


            • #7
              Zitat von hausl Beitrag anzeigen
              Heißt was? Debugg es halt. Führe die Query auf der DB auf, passiert dort das korrekte ja/nein? Und weiter etc etc..
              Alle Werte bleiben unverändert, auch wenn ein Script versucht, in die Datenbank zu schreiben.


              Zitat von hausl Beitrag anzeigen
              Keine Ahung ob das funktonieren kann, NOW() liefert üblicherwiese sowas: 2018-02-01 08:25:12

              Kannst ja mal prüfen was ein SELECT NOW() - 1 as foo liefert.

              Ich glaub du suchst eher DATE_ADD() oder so. https://dev.mysql.com/doc/refman/5.5...functions.html
              Wo/Wie kann ich am besten prüfen, was solche Funktionen zurückliefern?
              Wäre das ein guter Ansatz?: DATE_ADD(NOW(), INTERVAL -1800 SECOND)

              Kommentar


              • #8
                Direkt auf der DB einfach als SQL laufen lassen (PMA, Konsole oder einen SQL-Client deiner Wahl, meine Empfehlung HeidiSQL) und schaun was die DB zurückgibt.
                Code:
                SELECT DATE_ADD(NOW(), INTERVAL -1800 SECOND)
                gibt:
                Code:
                2018-02-01 09:17:56
                PHP.de Wissenssammlung | Debugging: Finde DEINE Fehler selbst! | mysql_* ist veraltet! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__ | Kein Support per PN

                Kommentar


                • #9
                  Also sieht das doch ganz brauchbar aus.
                  Habe folgendes Skript erstellt:
                  Code:
                  UPDATE `user`
                  SET login_attempts=0
                  WHERE attempt_time<DATE_ADD(NOW(), INTERVAL -1800 SECOND) AND login_attempts=3
                  Kann aber immer noch nicht in die Tabelle schreiben. Auch nicht wenn ich direkt auf "bearbeiten" klicke.
                  Bekomme folgende Meldung:
                  #1442 - Kann Tabelle 'user' in gespeicherter Funktion oder Trigger nicht aktualisieren, weil sie bereits von der Anweisung verwendet wird, die diese gespeicherte Funktion oder den Trigger aufrief

                  Kommentar

                  Lädt...
                  X