Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Formular sperren nach 3 Fehlversuchen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Formular sperren nach 3 Fehlversuchen

    Hi Community,
    ich arbeite zurzeit an einem Internen Bereich mit Login. Hier möchte ich, dass wenn jemand 3 mal die falschen Zugangsdaten eingegeben hat, dass das Formular nicht mehr da ist und er erst nach einer gewissen Zeit erneut versuchen kann sich einzuloggen.
    Wenn man nun testweise 3 mal etwas Falsches eingibt sagt er, dass man es erst in 15 erneut versuchen kann. So weit, so gut
    Lädt man die Seite nach 1 Minute neu und schickt die daten erneut ab(muss jedesmal neu bestätigt werden) steht da noch 14 Minuten... Wenn man aber die Seite normal aktualisiert ohne die Daten erneut abzuschicken, steht wieder 15 Minuten da
    Wie schaffe ich es, dass er eine Art Countdown macht und diesen auch bei neuladen aufrechterhält und nicht wieder von vorne anfängt??
    Vielen vielen Dank!!
    Lg phphtmlcss

    Hier noch der Code von der Login Datei:
    PHP-Code:
    /*
     *    Autor        : Dennis1993
     *    Copyright    : (c) 2011 by Dennis1993
     */
     
    session_start();
    define('SECURE', true);
    require_once('config.php');

    error_reporting(0);

    /**
     *    Anmeldevorgang
     */ 

      # Sperrzeit in Sekunden
      $timeDenied = 300;
      # zusätzliche Versuche ohne den ersten
      $maxTrys = 2;

      # Auswerten der Versuche, wenn über $maxTrys
      # $_SESSION['denied'] setzen und Versuche
      # zurücksetzen
      if(isset($_SESSION['trys']))
        if($_SESSION['trys'] >= $maxTrys){
          $_SESSION['denied'] = time()+$timeDenied;
          unset($_SESSION['trys']);
        }

      # Prüfen ob Wartezeit abgelaufen ist
      if(isset($_SESSION['denied']))
        if($_SESSION['denied']-time() <= 0)
          unset($_SESSION['denied']);
      if(isset($_POST['send']))
    {
        $user_email = strip_tags(htmlentities(trim(htmlspecialchars($_POST['user_email'], ENT_QUOTES))));
        $user_password = strip_tags(htmlentities(trim(htmlspecialchars($_POST['user_password'], ENT_QUOTES))));
        $password = md5($user_password);
        

            if(filter_var($user_email, FILTER_VALIDATE_EMAIL) && !empty($user_password) && !is_array($user_email) && !is_array($user_password))
        {
            $query = $SQL->prepare('SELECT `user_id` FROM `user` WHERE `user_email` = ? AND `user_password` = ?');
            $query->bind_param('ss', $user_email, $password);
            $query->execute();
            $query->store_result();
            $query->bind_result($user_id);

            //Sind Benutzerdaten vorhanden und korrekt?
            if($query->num_rows == 1)
            {
                $query->fetch();
                $_SESSION['user_id'] = $user_id;
                header('location: intern.php');
                exit();
            }
            else
            {
                      if(isset($_SESSION['trys']))
            $_SESSION['trys'] = $_SESSION['trys'] + 1;
          else
            $_SESSION['trys'] = 1;
    $error = "<p class='eingabefalsch'>Ihre Anmeldedaten sind nicht korrekt. Bitte wiederholen Sie Ihre Eingabe.<p>";
            }
        }
        else
        {
            $error = 'Bitte f&uuml;llen Sie alle Felder korrekt aus.';
        }
    }
    else
    {
        $error = NULL;
        $user_email = NULL;
    }

    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de-DE" lang="de-DE">

    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Login</title>
    </head>

    <body>
                         <h1>Einloggen</h1>
                      <p>Um in den Internen Bereich zugelangen, loggen Sie sich bitte hier ein:</p>
                      <br />
                      <?php 
                      
    echo $error;
                        if(isset(
    $_SESSION['denied'])):
                        
    # Optionale Ausgabe der verbleibenden Wartezeit
                        
    $error "";
                        echo 
    "<p style='color:red;'>Formular noch f&uuml;r ".ceil(($_SESSION['denied']-time())/60)." Minuten gesperrt.</p>";
                        else:

                      
    ?>
                    <form action="login.php" method="post">
                    <table cellpadding="1" cellspacing="4">
                        <tr>
                            <td><strong>E-Mail-Adresse:</strong>&nbsp;</td>
                            <td><input type="email" name="user_email" value="<?php echo $user_email?>" required placeholder="E-Mail-Adresse" maxlength="255" size="30"/></td>
                        </tr>
                        <tr>
                            <td><strong>Passwort:</strong></td>
                            <td><input type="password" name="user_password" required placeholder="Passwort" maxlength="50" size="30" /></td>
                        </tr><br />

                        <tr>
                            <td colspan="2"><input type="submit" name="send" value="Login" /></td>
                        </tr>
                    </table>
                    </form>
    </body>
    </html>
    <?php

      
    endif;

    ?>

  • #2
    Bevor du dich mit der Logik der Lösung beschäftigst: Speicher die tries auf jeden Fall nicht in $_SESSION.
    Ich muss dann quasi nur meine Kekse löschen und habe 3 neue Versuche. Von Automation durch curl (etc) ganz zu schweigen

    Richtiger(tm) wäre die Tries zusammen mit der IP des Besuchers in der DB/Datei/Memcache abzulegen.

    Kommentar


    • #3
      ok Danke.
      Wie bekomm ich die IP des Besuchers und soll ich das ganze dann mit in die DB von den usern nehmen oder eine eigene Tabelle machen?

      Kommentar


      • #4
        Ich wuerde das mit einer zusätzlichen Tabelle machen.
        Die IP bekommst du via $_SERVER['REMOTE_ADDR'], ausser du hast einen Reverseproxy dazwischen.
        Du kannst zusätzlich noch zu dem Benutzer einen Lock-Timeout einbauen - so dass man pro Benutzer nur 3 Versuche hat.

        Kommentar


        • #5
          Wie mach ich diesen Lock-Timeout?

          Kommentar


          • #6
            Puh, sei kreativ. Beispielsweise kannst du ein weiteres Feld zu deiner Benutzertabelle hinzufügen (oder eine 1:1 Identifying-Relation-Tabelle). Da steht dann der Wert 3 drin. Jedesmal, wenn ein User einen Fehlversuch macht, wird der Wert um 1 dekrementiert. Wenn der Wert auf 0 steht, dann setzt du in einem zweiten Feld ein Datum (in 15 Minuten) ab dem der Versuch wieder zulässig ist und setzt den Versuche wieder auf 3.

            Kommentar


            • #7
              wow. Ok werd da mal rumspielen... Vielen Dank für deine Hilfe!!

              Kommentar


              • #8
                nur mal der einfachkeitshalber, hab ich statt einer Datenbank eine txt-Datei verwendet (natürlich NUR zum testen ob es funktioniert. Entgültig werde ich natürlich eine DB verwenden).
                und hab einen Teil geschafft. Denn nun sperrt er nach 3 Versuchen, den Zugang. Nun zu meinen (neuen) Fragen:
                1. Wie schaffe ich es, dass genau diese IP-Adresse gesperrt wird.
                2. Wie mache ich, dass er die IP-Adresse nach 15 Min wieder frei gibt.

                Hierzu hab ich bereits eine Tabelle in meiner DB angelegt mit 3 Spalten:
                1 ipadress
                2 nochversuche
                3 zeitsperre

                Hier noch der Ausschnitt aus meinem neuen Code:
                PHP-Code:
                  if(isset($_POST['send']))
                {
                    
                $user_email strip_tags(htmlentities(trim(htmlspecialchars($_POST['user_email'], ENT_QUOTES))));
                    
                $user_password strip_tags(htmlentities(trim(htmlspecialchars($_POST['user_password'], ENT_QUOTES))));
                    
                $password md5($user_password);
                    
                $userip $_SERVER['REMOTE_ADDR'];
                $datei "counter.txt";
                $i 1;
                if(!
                is_file($datei))
                {
                    
                file_put_contents($datei$startwert);
                    
                $content $i;
                }
                else
                {
                    
                   
                $content file_get_contents($datei);
                }

                        if(
                filter_var($user_emailFILTER_VALIDATE_EMAIL) && !empty($user_password) && !is_array($user_email) && !is_array($user_password))
                    {
                        
                $query $SQL->prepare('SELECT `user_id` FROM `user` WHERE `user_email` = ? AND `user_password` = ?');
                        
                $query->bind_param('ss'$user_email$password);
                        
                $query->execute();
                        
                $query->store_result();
                        
                $query->bind_result($user_id);

                        if(
                $content >=3) {
                            echo 
                "Du hast alle Versuche aufgebraucht!";
                            exit;
                        } else {
                        
                //Sind Benutzerdaten vorhanden und korrekt?
                        
                if($query->num_rows == 1)
                        {
                            
                $query->fetch();
                            
                $_SESSION['user_id'] = $user_id;
                            
                $i 0;
                            
                header('location: intern.php');
                            exit();
                        }
                        else
                        {
                            
                $content++;
                            
                file_put_contents($datei$content);
                        }
                        }
                    }
                    else
                    {
                        
                $error 'Bitte f&uuml;llen Sie alle Felder korrekt aus.';
                    }
                }
                else
                {
                    
                $error NULL;
                    
                $user_email NULL;

                Kommentar


                • #9
                  Bei meinen Formularen habe ich noch eine minimale Zeitangabe gemacht. z.B bei einem Kontaktformular benötigt man min. 2 Sekunden zum Eingeben bei einem anderen viellecht mehr. Habe bisher absolut kein Spam erhalten. Nur so als zusätzliche Idee.

                  Kommentar


                  • #10
                    Und wenn deine Benutzer die Funktionen ihres Browsers verwenden und die formularfelder (grade beim Login) schon vorausgefüllt sind. schonmal nachgedacht?
                    Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

                    Kommentar


                    • #11
                      Zitat von Geromel Beitrag anzeigen
                      Und wenn deine Benutzer die Funktionen ihres Browsers verwenden und die formularfelder (grade beim Login) schon vorausgefüllt sind. schonmal nachgedacht?
                      Gibt es nicht diese Möglichkeit?
                      PHP-Code:
                      echo "<form action='' name='form2' id='form2' autocomplete='off'>"
                      Ich hab das zwar noch nie selbst verwendet und weiß nicht ob es von vielen Browsern ignoriert wird, aber so kann man das Autofill verhindern.
                      Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

                      Kommentar


                      • #12
                        Ich wollte damit sagen, dass die Usability drunter leidet. Das ist genau wie mit den Captchas, die kein Mensch mehr lesen kann.
                        Es gibt generell bessere Möglichkeiten sein Formular zu schützen.
                        Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

                        Kommentar


                        • #13
                          Welche beispielsweise? Ich verwende auch manchmal einfach ein unsichtbares Feld. Wenn dieses ausgefüllt ist, lass ich die Aktion abbrechen

                          Kommentar


                          • #14
                            Richtig, aber bei einem herkömmlichen login braucht man keinen weiteren Spamschutz. Die bots können sich nur versuchen einzuloggen, und dafür sperrst du ja dein Script für x Minuten...
                            Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

                            Kommentar


                            • #15
                              Ok dann lass ich den Spamschutz weg. Danke!
                              Habs mittlerweile mit den Fehlversuchen geschafft..
                              Danke an alle für eure Hilfe!!

                              Kommentar

                              Lädt...
                              X