2016-07-13 14 views
1

Ich möchte ein einfaches Login-System in meiner Website erstellen, die ich für akademische Zwecke entwickle.Einfacher und effizienter Login-Mechanismus mit PHP und Datenbank

Das ist, was ich bisher getan:

  1. Ein Benutzer wird, ein Formular zur Eingabe von Benutzername und Passwort ausfüllen muß und dann das Formular (POST Methode) einreichen. Beide Vars werden bereinigt.
  2. Abfrage von Datenbank

    SELECT id FROM user WHERE username = x AND 
    password = y 
    

    Wo x und y sind Benutzername und Passwort erworben

    $_POST['variable_name'] 
    
  3. Dann verwendet, um ich PHP-Funktion rowCount(). Wenn das Ergebnis = 1 (und nur eins) ist, wird dieser Benutzer benachrichtigt, dass der Anmeldevorgang erfolgreich ist und eine Benutzer-ID-Sitzungsvariable gesetzt wird.

Also, ist diese Art von Login-System einfach und effizient genug? Ich brauche jetzt keine zusätzliche Sicherheitsmaßnahme (wie Passwort-Hashing).

+0

Das Sanitisieren von Variablen anstelle von parametrisierten Abfragen ist vor 10 Jahren aus der Mode gekommen (dh nicht Best Practice). Ich sehe keinen Grund, kein Hashing hinzuzufügen, es ist überhaupt nicht schwer, das Passwort api zu verwenden, das in php (password_hash und password_verify) eingebaut ist. Am häufigsten werden die Daten des Benutzers tatsächlich abgerufen. Sie möchten wahrscheinlich die Benutzer-ID zu ession hinzufügen, damit Sie wissen, welcher Benutzer bei der Verarbeitung späterer Anforderungen angemeldet ist. – JimL

+0

@JimL meinen Sie parametrisierte Abfragen mit 'prepare()' und ' execute() '? Wenn ja, kann ich das verwenden. Dito auf 'password_hash' und' password_verify'. – GPraz

+0

Ja, in der Tat ersetzt Vars in der Abfragezeichenfolge mit? oder: parameterName – JimL

Antwort

2

Dies ist, wie es mit moderneren Standards getan werden soll:

$db = new PDO('mysql:host='.$database_host.';dbname='.$database_name.';charset=utf8', $database_user, $database_password); 

$stmt = $db->prepare("SELECT id FROM users WHERE username=? AND password=?"); 
$stmt->execute([$_POST['username'], $_POST['password']]); 

$user = $stmt->fetch(); // Or fetchColumn() to get just the id 

if($user) { 
    // Login 
} else { 
    // The user doesn't exist or the password is wrong 
} 
+0

Soll ich die PDO-Instanz 'prepare()' und 'execute()' innerhalb von 'try catch' erstellen, falls während der Verbindung zur Datenbank ein Fehler auftritt? – GPraz

+0

Ja, indem der vierte Parameter '[PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION]' zum PDO-Konstruktor hinzugefügt wird. Sie können auch überprüfen, ob '$ _POST ['Benutzername']' und Passwort gesetzt sind –

0

Verwendung gU oder mysqli zur Verhinderung von SQL-Injection und schnellen Datenwieder

hier ist der Code

<?php 
    $avail=0; 
    require 'connect.php'; 
    if(isset($_POST['Submit'])) 
    {  $Username=$_POST['Username']; 
      $Password=$_POST['Password']; 
      $query=$handler->query('Select * FROM users');  
      while($r=$query->fetch(PDO::FETCH_ASSOC)){ 
       $U=$r['Username']; 
       $P=$r['Password']; 
       if($U==$Username&&$P==$Password){ 
        $avail=1; 
       } 
       } 
       if($avail==1){ 
        echo("<script>window.location = 'welcome.html';</script>"); 
       } 
       if($avail==0){ 
        echo("<script>alert('Wrong Username or Password')</script>"); 


       } 

    } 

?> 
+0

Was ist mit der Verwendung von 'if ($ query -> rowCount() == 1)' anstelle von 'if ($ U == $ Benutzername & $ P == $ Passwort) '? Ist es notwendig, alle Zeilen aus der Benutzertabelle auszuwählen und die while-Schleife zu verwenden? – GPraz

+0

Es gibt keine Injektionsprävention in diesem "Code" ... es ist schlecht geschrieben und die Logik ist völlig falsch ... (Radfahren alle Benutzer?!?) ... und es hängt auch von benutzerdefinierten Funktion in 'connect.php ', die wir nicht sehen können ... –

+0

ich denke, verbinden.PHP ist spezifisch für jeden Benutzer, was mein Hauptaugenmerk auf die Verwendung von PDO – art