PHP PHP - MYSQL- einfache Authentifizierung

neuhier08

Lt. Commander
Registriert
Sep. 2008
Beiträge
1.710
Ich habe hier eine html-Form in einer PHP-Seite, wo username und passwort eingegeben werden können und ein Button vorhanden ist. Klickt man auf den Button, soll in der MYSQL-DB überprüft werden, ob der username und/oder das Passwort mit jenen aus der DB übereinstimmen.

Die MYSQL-DB sieht wie folgt aus:

feld 1 - ID - autoincrement
feld 2 - user - text
feld 3 - password - text

In der DB existieren 2 Nuterz mit jeweils 1ID, 1username, 1passwort.

Wie schaffe ich es nun, per PHP bzw. MYSQL zu überprüfen, ob der User aus der HTML-Form mit einem der User in der DB übereinstimmt?
 
wenn du das selber noch nicht weist solltest du dich nicht mit dem Thema 'Authentifizierung' auseinandersetzen sondern viel mehr PHP- und mySQL Grundlagen lernen...

Aber rein logisch gesehen ist es doch kein problem...

deine id ist eindeutig also selectiere den eintrag aus der datenbank die die gleiche id hat wie aus dem formula und dann vergleichst du ob das passwort gleich ist...
 
Zuletzt bearbeitet:
PHP:
<?php

session_start();

$query = '
SELECT
  `id`,
  `user`,
  `password`
FROM
  `users`
WHERE
  `user` = \''.$_POST['login']['user'].'\' AND
  `password` = \''.md5( $_POST['login']['user'].'\'';
$query = mysql_fetch_array( mysql_query( $query ) );

if( sizeof( $query ) == 0 ) echo 'falscher username';
else
{
  echo 'login erfolgreich';
  $_SESSION['user']['id'] = $query['id'];
  $_SESSION['user']['name'] = $query['user'];
}

?>
an deiner stelle empfehle ich dir aber, user und password auf varchar(255) o.ä. zu setzen. [edit: password kann fix auf 32 zeichen begrenzt und evtl. auf den typ char definiert werden, insofern du md5-hashes o.ä. benutzt - zumindest solltest du irgend eine hash-funktion nutzen, damit die passwörter nicht plain in der db liegen und damit bei einer sql-injection ausgelesen werden können.] der text-datentyp ist nämlich eigentlich für größere texte definiert worden und eine sortierung o.ä. kannst du damit ebenso nicht vornehmen.
 
Zuletzt bearbeitet:
@claW:

ich hoffe wirklich dass neuhier08 nicht den fehler gemacht hat und die passwörter einfach nur in md5 verschlüsselt hat...

wie gesagt... grundlagen lernen


P.S: varchar(255) für den benutzername find ich auch extrem verschwenderisch....
wer hat bitte schon so einen langen benutzername?!
 
Oft verschlüsselt man das eingegeben PW noch mit SHA oder MD5.

So können in abgefangenen Packeten (Man in the Middle Attacken etc) die Passwörter nicht so einfach gesehen werden.

In der Datenbank speichert man dann auch verschlüsselt ab.

Ich muss jedoch zugeben, weder SHA noch MD5 sind wirklich sicher.
Mit den richtigen Tools wird beim Abfangen sofort dekodiert und angezeigt.

Jetzt stellt sich noch die Frage, wie sicher müsste das Login sein?

EDIT:

@rejoice: wie kann man denn die Passwörter sinnvoll verschlüsseln?
Gibt es noch andere Methoden, welche besser sind als SHA1 und MD5?

Blowfish ist doch kaum eine Variante da noch ein Key übermittelt werden müsste.
 
Zuletzt bearbeitet:
rejoice schrieb:
ich hoffe wirklich dass neuhier08 nicht den fehler gemacht hat und die passwörter einfach nur in md5 verschlüsselt hat...
salted hashes wären natürlich super, aber von nem anfänger kann man das imo nocht nicht verlangen. außer er will ein großes portal aufsetzen, dann ist es natürlich was anderes.
rejoice schrieb:
P.S: varchar(255) für den benutzername find ich auch extrem verschwenderisch....
wer hat bitte schon so einen langen benutzername?!
klar, wollt nur großzügig im bezug auf text sein. 32 zeichen sollten i.d.r. natürlich für jeden ausreichen oder auch 16 (je nach portal kanns natürlich abweichungen geben).
Gohst schrieb:
Oft verschlüsselt man das eingegeben PW noch mit SHA oder MD5.
nicht verschlüsseln, sondern hashen. zwei grundlegend verschiedene konzepte. hashes sind einfach prüfsummen.
Gohst schrieb:
Ich muss jedoch zugeben, weder SHA noch MD5 sind wirklich sicher.
aha? das wäre mir neu. also ist heutzutage gar keine datenbank mit userdaten mehr sicher?
Gohst schrieb:
Mit den richtigen Tools wird beim Abfangen sofort dekodiert und angezeigt.
wäre gut, für nen anfänger aber viel zu viel des guten.
Gohst schrieb:
@rejoice: wie kann man denn die Passwörter sinnvoll verschlüsseln?
Gibt es noch andere Methoden, welche besser sind als SHA1 und MD5?
nein gibt keine anderen, sobald man salted hashes verwendet. das sicherere wäre dann nur die verschlüsselung selbst (mit aes oder irgendwas), was für nen login aber weit überdimensioniert wäre. zumal die rechenlast auch unverhältnismäßig ansteigt, für so ein kleines passwort.
 
Gohst schrieb:
EDIT:

@rejoice: wie kann man denn die Passwörter sinnvoll verschlüsseln?
Gibt es noch andere Methoden, welche besser sind als SHA1 und MD5?

Blowfish ist doch kaum eine Variante da noch ein Key übermittelt werden müsste.


schau dir mal http://www.php-einfach.de/improved_hash_algorithm.php an... ein bisschen modifiziert und ausgebaut und schon hast du nen super login
 
Gohst schrieb:
Oft verschlüsselt man das eingegeben PW noch mit SHA oder MD5.

[...]

Ich muss jedoch zugeben, weder SHA noch MD5 sind wirklich sicher.
Mit den richtigen Tools wird beim Abfangen sofort dekodiert und angezeigt.
MD5 und SHA sind Hash Algorithmen, keine Verschlüsselung. Es ist unmöglich aus dem Hash wieder eindeutig das Passwort zu rekonstruieren, und darum geht es dabei wenn man Hashes an dieser Stelle verwendet. Wird die Datenbank kompromittiert, so ist nur der Hash bekannt, nicht jedoch das eigentliche Passwort.

claW. schrieb:
zumindest solltest du irgend eine hash-funktion nutzen, damit die passwörter nicht plain in der db liegen und damit bei einer sql-injection ausgelesen werden können.

A propos SQL Injection - Dein Code lädt geradezu dazu ein.
 
DjNDB schrieb:
A propos SQL Injection - Dein Code lädt geradezu dazu ein.
i know, aber wieso sollte ich beispielcode mit allem ausstatten was auftreten kann? ich hab ihm das stichwort gegeben und mit ein wenig eigenrecherche wäre das zu erledigen. will ihm ja nur die grundlagen zeigen und mehr nicht.
 
Also folglich ist es immer noch sinnvoll, Passwörter MD5 oder SHA1 verschlüsselt zu übermitteln?

Weil irgendwie muss ja die Eingabe über das HTML Formular im Header übermittelt werden.
So wenn ich jetzt an ein normales Login von nem Fourm oder so denke?

Ich habe ja nicht an Datenbank-Einbrüche gedacht, sondern eben an die Schwachstellen des HTML's beim Übermitteln.

Reicht es denn, wenn man einfach HTTPS verwendet, was sowieso alles verschlüsselt, und dann das eingegeben Passwort etc. noch MD5 oder SHA1 verschlüsselt?

Vermutlich habe ich was falsch verstanden...
Im Netz gibt es aber haufenweise Tools, welche aus dem mit MD5 generierten HASH wieder den Plan-Text generieren.

Beispiel:

Ich generiere aus dem Satz "Hello World" den MD5 Hash: b10a8db164e0754105b7a99be72e3fe5

Dekodiert mit dem Tool da: http://www.md5decrypter.com/
Resultat: Hello World

Genau das habe ich gemeint.
 
Zuletzt bearbeitet:
du solltest dich auch unbedingt mit dem thema sicherheit außeinandersetzen

durch das einfache verwenden des post-arrays kann man ganz leicht sql-injections betreiben - gefährliche sache
 
Gohst schrieb:
Also folglich ist es immer noch sinnvoll, Passwörter MD5 oder SHA1 verschlüsselt zu übermitteln?

Weil irgendwie muss ja die Eingabe über das HTML Formular im Header übermittelt werden.
So wenn ich jetzt an ein normales Login von nem Fourm oder so denke?

Ich habe ja nicht an Datenbank-Einbrüche gedacht, sondern eben an die Schwachstellen des HTML's beim Übermitteln.

Reicht es denn, wenn man einfach HTTPS verwendet, was sowieso alles verschlüsselt, und dann das eingegeben Passwort etc. noch MD5 oder SHA1 verschlüsselt?

Entscheidend ist hier gegen welche Bedrohung geschützt werden soll. Um die Passwörter der Benutzer gegen Angriffe auf den Server zu schützen bietet sich an die Passwörter wie claW. sagt als salted Hash zu speichern.

Wenn du dir jedoch sorgen um Man in the Middle Angriffe zwischen Client und Server machst, dann hilft nur durchgehendes HTTPS mit sicheren Parametern.

Das Passwort schon auf dem client zu hashen wäre unsinn. Effektiv würde somit der Hash zum Passwort und es wäre nichts gewonnen.

Wenn du nicht davon ausgehst, dass die Verbindung unsicher ist, dann genügt es
wenn du HTTPS nur für den Login verwendest. Dann hast du zumindest das Passwort sicher übertragen. Allerdings wird bei jeder Anfrage die Session ID im Klartext übertragen, sodass du einen Kompromiss eingegangen bist. Wer die Session ID herausgefunden hat, kann solange diese gültig ist den Account nutzen.
Deshalb sollte man sich bei sicherheitskritischen Webanwendungen auch immer ausloggen wenn man sie nicht mehr benötigt. Auf Entwicklerseite sollten Sessions zudem eine begrenzte Lebensdauer haben.
Ergänzung ()

Gohst schrieb:
Beispiel:

Ich generiere aus dem Satz "Hello World" den MD5 Hash: b10a8db164e0754105b7a99be72e3fe5

Dekodiert mit dem Tool da: http://www.md5decrypter.com/
Resultat: Hello World

Genau das habe ich gemeint.

Das funktioniert nur, weil der Hash bereits in der Datenbank existiert. Es ist aber davon auszugehen, dass mehrere völlig anderere Texte den selben Hash erzeugen. Beim Hashing wird eine theoretisch unendliche Anzahl Klartexte auf eine begrenzte Anzahl Zeichen abgebildet. Da sind Kollissionen garantiert, bei MD5 z.B. spätestens wenn man > 2^128 Klartexte hasht.

Es lässt sich vom Hash also nicht eindeutig auf den Klartext schließen.
Du hast keine Bijektion, sondern Surjektion.

Es wäre also theoretisch möglich alle Hashes für einen Algorithmus zu generieren und zu jedem Hash einen gültigen Klartext zu haben. In der Praxis wird das bisher am enormen Speicherbedarf scheitern.
Zudem ist damit nicht viel gewonnen, wenn der Hash einen Salt hatte.
 
Gohst schrieb:
Ich generiere aus dem Satz "Hello World" den MD5 Hash: b10a8db164e0754105b7a99be72e3fe5

Dekodiert mit dem Tool da: http://www.md5decrypter.com/
Resultat: Hello World

Naja, das funktioniert auch nur mit solchen Passwörtern, die bei md5decrypter.com in der Datenbank sind. Probier doch mal ein X-beliebiges aus, dann wird dir auch md5decrypter nichts mehr ausspucken!



Mein Vorschlag lautet wie folgt:
PHP:
$salt = uniqid(mt_rand(), true);
$password_hash = hash('sha512', $salt.$_POST['password']);

Der Salt macht das Passwort einmalig in der Datenbank.
 
Zuletzt bearbeitet:
Ach so der Online-Decoder speichert alles in ne DB.

Hmm ok jetzt verstehe ich es.
 
ich schreibs einfach nochmal: wenn ihr einen ordentlichen hash wollt schaut euch das an: http://www.php-einfach.de/improved_hash_algorithm.php

besser kann man es eigentlich nicht machen vor allem weil man so viele möglichkeiten zum einstellen hat...

ich hab das script selber im einsatz und bin vor allem von der einfachen integration angetan
 
@rejoice: was Du dort verlinkst, ist kein eigenständiger Hash-Algorithmus, sondern eine Funktion, die bekannte Hash-Funktionen zusammen mit einem Salt und weiteren Zusatzparameter benutzt. Die dort angebotene Funktion vereint einige hier genannten Sicherheitskonzepte.
 
@XunnD: das ist richig und entsprechend hat man alles in einem und braucht sich um (fast) nix weiter sorgen zumachen - jedenfalls wenn es um den hash an sich geht
 
Zurück
Oben