php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.03.2011, 13:29  
Erfahrener Benutzer
 
Registriert seit: 09.07.2008
Beiträge: 577
PHP-Kenntnisse:
Anfänger
SteiniKeule kann nur auf Besserung hoffen
SteiniKeule eine Nachricht über ICQ schicken SteiniKeule eine Nachricht über Skype™ schicken
Standard Sicherer/Sinnvoller für Passwortabfragen

Hallo

Ich habe mich gerade gefragt was wohl besser wäre.
Soll ich erst prüfen ob das eingegebene Passwort in der DB vorhanden ist und dann überprüfen ob es zu dem Benutzernamen passt. Oder soll ich erst den Benutzer suchen und dann das Passwort überprüfen?

Gibt es eine bessere Möglichkeit Passwörter zu speichern als mit MD5 und Salt?

Danke
__________________
Der Unterschied zwischen dem richtigen Wort und dem beinahe richtigen ist derselbe Unterschied wie zwischen dem Blitz und einem Glühwürmchen.
SteiniKeule ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 30.03.2011, 13:38  
Benutzer
 
Benutzerbild von m0dpad
 
Registriert seit: 20.03.2011
Beiträge: 49
PHP-Kenntnisse:
Fortgeschritten
m0dpad befindet sich auf einem aufstrebenden Ast
Standard

Wie wärs mit beidem gleichzeitig?
__________________
Staticfloat
m0dpad ist offline   Mit Zitat antworten
Alt 30.03.2011, 13:40  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

übergib am Besten sowohl den Usernamen als auch den berechneten Hashwert zur Passwort-Eingabe an die Datenbank.

Die Rückmeldung sollte sowieso so wenig Aufschluss wie möglich geben , falls die Anmeldung nicht erfolgreich war ...

Ein Angreifer könnte sonst Rückschlüsse ziehen, die ihm helfen

Eine Meldung wie "Falscher Benutzername und / oder Kennwort
Bitte loggen Sie sich ein.", gibt wenig Aufschluss, wenn sie in beiden Fällen kommt.
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 30.03.2011, 13:41  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.234
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Zu ersten Frage: Das kommt auf die Fehlermeldung an. Wenn du in beiden Fällen nur ausgibst "Benutzername oder Passwort fehlerhaft" ist es technisch irrelevant. Wenn du hingegen konkret schreibst "Benutzer unbekannt" bzw. "Passwort fehlerhaft", wäre es unlogisch, erst das Passwort zu suchen um dann, nur weil irgendein anderer User das Passwort hat, den Fehler "Benutzername fehlerhaft" auszugeben.
Zudem: Der Benutzername sollte immer eindeutig sein. Hier findest du also immer einen Datensatz. Das Passwort kann theoretisch bei 500 Benutzern stehen, dann würdest du mit dem ersten Select 500 Datensätze haben.

Zur zweiten Frage: Ähhhm. Im Prinzip nicht. Definiere als erstes mal "besser". Was anderes würde ich nur nehmen, wenn irgendwann jeder zuhause 150 Prozessorkerne hat und damit in Sekundenbruchteilen deine Passwörter knacken kann. Dann gibt es halt neue Funktionen statt md5. Das dauert noch zig Jahre. Alternativen sind nur wichtig, wenn du das Passwort wieder entschlüsseln musst. Das dürfte für dich aber vollkommen uninteressant sein.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline   Mit Zitat antworten
Alt 30.03.2011, 13:59  
Erfahrener Benutzer
 
Registriert seit: 09.07.2008
Beiträge: 577
PHP-Kenntnisse:
Anfänger
SteiniKeule kann nur auf Besserung hoffen
SteiniKeule eine Nachricht über ICQ schicken SteiniKeule eine Nachricht über Skype™ schicken
Standard

Als erstes bringe ich mal bischen Würze in die Sache:
PHP-Code:
DEFINE("SALT1","i1=ae:xÄ2d%TjGOB");
DEFINE("SALT2","sN&mNZ0Grg_8jTXA"); 
Hier die Funktion:
PHP-Code:
/**
   Prüft die Anmeldedaten
   */
   
public function anmelden ($sql$username$password)
      {
        
$passwort_abfrage $sql->query("SELECT * FROM `users` WHERE Passwort = '".$password."' AND Name = '".$username."';");
       
        if(
$sql->num_result($passwort_abfrage) == "0")
        {
           echo 
'<div class="formbox">
           '
.$password.'<br />
                    Die eingegebene Kombination aus Benutzername und Passwort sind nicht richtig.
                    <form action="?action=login" method="post">
                      <div class="reihe">
                        <span class="label">Username</span>
                        <span class="feld"><input type="text" class="defbreite" size="30" name="username"/></span>
                      </div>
                    
                      <div class="reihe">
                        <span class="label">Passwort</span>
                    
                        <span class="feld"><input type="password" class="defbreite" size="30" name="passwort" /></span>
                      </div>
                    
                    
                      <div class="knopf">
                      <span class="label">Dauerhaft einloggen&nbsp;&nbsp;</span>
                      
                        <input type="checkbox" name="dauerhaft" /><br />
                        <input type="submit" value="Einloggen" />
                      </div>
                    </form>
                    
                    </div> '
;
        }
        else
        {
            
$benutzer_daten $sql->object_result($passwort_abfrage);
            return(
$benutzer_daten->ID);
        }
        
      
      } 
und am Ende noch der Aufruf:
PHP-Code:
$log->anmelden($sql$sql->sql_string($_POST['username']),md5($sql->sql_string($_POST['passwort']).SALT2)); 
Kann jemand Schwachstellen / Fehler entdecken oder hat jemand Ideen wie man das besser lösen könnte.
__________________
Der Unterschied zwischen dem richtigen Wort und dem beinahe richtigen ist derselbe Unterschied wie zwischen dem Blitz und einem Glühwürmchen.
SteiniKeule ist offline   Mit Zitat antworten
Alt 30.03.2011, 14:08  
Globe31
Gast
 
Beiträge: n/a
Standard

Mir fällt spontan das SELECT * auf! Wähle konkret die Felder die du benötigst! SELECT * ist schlechter Stil!
  Mit Zitat antworten
Alt 30.03.2011, 14:16  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.234
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

1. Du solltest das Escapen nicht beim Aufruf machen, sondern in der Methode selbst. Sonst musst du immer dran denken, wenn du sie tatsächlich aufrufst.
2. Ich hoffe für dich, dass du die Ausgabe des Passwortes direkt über dem Formular nur zu Debug-Zwecken machst. Ansonsten ausbauen.
3. Für später beschäftige dich mit dynamischen Salts. Also: Nicht unbedingt hart kodieren. Beispielsweise einen Salt, der sich aus der User-ID und dem Anmeldedatum und einem festen Wert ergibt. Dann geht das jedoch nicht mehr so, dass du das Passwort im Select mit übergibst, da du ja die User-ID wissen musst um den richtigen Passwort-Wert erst noch zu berechnen. Muss aber nicht sein.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline   Mit Zitat antworten
Alt 30.03.2011, 14:33  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Wozu escaped man einen String den man eh Hashed ?
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 01.04.2011, 08:32  
Erfahrener Benutzer
 
Registriert seit: 09.07.2008
Beiträge: 577
PHP-Kenntnisse:
Anfänger
SteiniKeule kann nur auf Besserung hoffen
SteiniKeule eine Nachricht über ICQ schicken SteiniKeule eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Globe31 Beitrag anzeigen
Mir fällt spontan das SELECT * auf! Wähle konkret die Felder die du benötigst! SELECT * ist schlechter Stil!
Daran habe ich gedacht. Danke. Die Tabelle besteht nur aus ID, Benutzername und Passwort. Und die 3 Werte brauche ich auch. (ID zur Rückgabe)

Zitat:
Zitat von tr0y Beitrag anzeigen
Wozu escaped man einen String den man eh Hashed ?
Gute Frage. Ich mache es wohl aus Gewohnheit. Alles was in die DB kommt wird escaped. Aber danke. Kann ich ausbauen.

Zitat:
Zitat von mepeisen Beitrag anzeigen
1. Du solltest das Escapen nicht beim Aufruf machen, sondern in der Methode selbst. Sonst musst du immer dran denken, wenn du sie tatsächlich aufrufst.
2. Ich hoffe für dich, dass du die Ausgabe des Passwortes direkt über dem Formular nur zu Debug-Zwecken machst. Ansonsten ausbauen.
3. Für später beschäftige dich mit dynamischen Salts. Also: Nicht unbedingt hart kodieren. Beispielsweise einen Salt, der sich aus der User-ID und dem Anmeldedatum und einem festen Wert ergibt. Dann geht das jedoch nicht mehr so, dass du das Passwort im Select mit übergibst, da du ja die User-ID wissen musst um den richtigen Passwort-Wert erst noch zu berechnen. Muss aber nicht sein.
1. Gute Idee, danke.
2. Die Ausgabe ist nur dazu da, um den Wert dann von Hand in die DB einzutragen. Also nur zum Testen.
3. Wäre es auch ok, wenn ich die ersten 4 Buchstaben des Benutzernamens als md5 als Salt verwende? Ich habe zu dem Benutzer keine weitere Informationen. Nur ID, Username, Passwort. Ich könnte natürlich auch noch eine Spalte erstellen wo ich beim Anlegen des Benutzers einen Salt aus time() oder microtime() und md5 erstelle.
Dann würde ich beim Einlogen den Salt vom Benutzer abfrage, daraus dann den PW-Hash erstellen und das Ergebnis dann mit dem gespeicherten PW überprüfen.
__________________
Der Unterschied zwischen dem richtigen Wort und dem beinahe richtigen ist derselbe Unterschied wie zwischen dem Blitz und einem Glühwürmchen.
SteiniKeule ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php code passwort abfragen, unterschied zwischen psswort username kennwort

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:07 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum