Admin Bereich erstellen

Grawapple

Uelzener Rambour
Registriert
13.05.06
Beiträge
373
Hallo zusammen
Ich möchte einen eigenen Admin-Bereich erstellen.
Dafür möchte ich verschiedene Benutzer erstellen. Kann mir vieleicht jemand sagen, wie ich machen kann, dass das skript überprüft ob dieser name mit diesem passwort vorhanden ist und dann weiterleitet?

Warte auf Antworten

Grawapple
 

.holger

Borowitzky
Registriert
13.09.04
Beiträge
8.970
Ganz einfach:

Du legst eine MySQL Tabelle mit den benutzern und das (am besten md5 verschlüsselte) Passwort.

Dann nimmst Du ein Formular, dort lässt Du von Benutzer die Daten eintragen, dieses Formular leitet auf die Prüfung, in der Du guckst ob Benutzername und (verschlüsseltes) Passwort vorkommen, vergibst eine SessionID, Benutzername und ID in der Session und dann wird im Adminbereich auf jeder Seite geguckt ob die SessionID, der Name und die ID mit den Daten in der Datenbank übereinstimmen, nur dann wird die Seite ausgegeben.

Ganz einfach.
 

Grawapple

Uelzener Rambour
Registriert
13.05.06
Beiträge
373
Alles klar
Bis auf die erste überprüfung mit der mysql abfrage.

Grawapple
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
Hallo zusammen
Ich möchte einen eigenen Admin-Bereich erstellen.
Dafür möchte ich verschiedene Benutzer erstellen. Kann mir vieleicht jemand sagen, wie ich machen kann, dass das skript überprüft ob dieser name mit diesem passwort vorhanden ist und dann weiterleitet?

Warte auf Antworten

Grawapple

Eigentlich solltest Du nur prüfen, ob ein Benuztername schon vorhanden ist. Und wenn Du den Benuzernamen "unique" machst, dann solltest Du einen fehler bekommen, wenn jemand versucht sich mit dem gleichen namen zu registrieren.
 

wapplegraph

Normande
Registriert
12.04.06
Beiträge
571
Ganz einfach:

in der Du guckst ob Benutzername und (verschlüsseltes) Passwort vorkommen,[...]Ganz einfach.

Jawohl, doch an dieser Stelle habe ich eine Frage. Das überprüfen, würde ich jetzt mit preg_match() machen, doch ich weiss, dass dies sicherlich nicht die beste und MySQL freundlichste Methode ist. Wie löst man es besser?

wapplegraph
 

kauan

Stina Lohmann
Registriert
31.12.05
Beiträge
1.043
Code:
$sql = "SELECT id FROM user WHERE LOWER(name) = LOWER('$name') and MD5(password) = MD5('$password')";
$qry = mysql_query($sql);
if(mysql_num_rows($qry) > 0) {
    // login ok
} else {
    // login failed
}

gruss
Jonathan
 

wapplegraph

Normande
Registriert
12.04.06
Beiträge
571
Wow

Ja aber ich möchte es MySQL mässig verstehen, also die Befehle.

wapplegraph
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
kauan schrieb:
Code:
$sql = "SELECT id FROM user WHERE LOWER(name) = LOWER('$name') and MD5(password) = MD5('$password')";

Diese Form sollte man so wie hier nie verwenden und auch besser nicht veröffentlichen, denn diese Schreibweise enthält ernstzunehmende Sicherheitsprobleme, doch das sei hier nicht Gegenstand.

Ich erlaube mir also, das ganze ein wenig umzuschreiben:

Code:
<php

    $sql = "SELECT id ";
    $sql .= "FROM user ";
    $sql .= sprintf("WHERE LOWER(name) = LOWER('%') ", mysql_real_escape_string($name));
    $sql .= sprintf("AND MD5(password) = MD5('%s')", mysql_real_escape_string($password));
    $sql .= "LIMIT 1";
?>

Zusätzlich sorgt hier die Ergebnismengenbegrenzung "LIMIT 1" dafür, dass die Abfrage wesentlich schneller asugeführt werden kann.

Klarer so?
 

Hobbes_

Gast
Vielen Dank für diesen Kommentar zur Sicherheit!!

Ein Problem zahlreicher selbstgestrickter PHP/MySQL-Anwendungen im Netz ist die fehlende Kontrolle bezüglich der Benutzereingaben. Dies kommt häufig davon, dass einfach die Beispiele, die zur Illustration einer Technik vereinfacht veröffentlicht wurden (siehe auch http://www.php.net ) einfach 1:1 in reale Programme übernommen werden...

Leider ist es so, dass nicht nur versehentliche fehlerhafte Benutzereingaben abgefangen werden müssen, sondern auch echt auf Schädigung des Systems ausgelegte Eingaben. Da macht man sich gelegentlich keine Vorstellungen, wie ein einfaches System ausgenutzt werden kann. Deshalb ist auch Dein Link super!

Kurz: Programmierer von interaktiven Web-Seiten übernehmen eine grosse Verantwortung, da der Input, der irgendwie übers Netz zum Server kam, nicht vorhersehbar ist... Traue keinem Input, bis geprüft wurde, dass er genau einer valablen und sicheren Eingabe für diesen spezifischen Parameter entspricht (Typ, Range, Länge, Zeichenzusammenstellung, Escapen von Problemzeichen,...).
 

wapplegraph

Normande
Registriert
12.04.06
Beiträge
571
Hallo

Was bedeutet genau: LOWER() & MD5() dies ist mir unklar.

Danke wapplegraph
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Hallo

Was bedeutet genau: LOWER() & MD5() dies ist mir unklar.

Danke wapplegraph

LOWER() macht Buchstaben klein und MD5() wendet den Verschlüsselungsmechanismus »MD5« auf das jeweilige Argument an.

Zu finden im MySQL-Handbuch. Tipp: Wenn Du die Dokumentation zu einem MySQL-Begriff suchst, kannst den Suchbegriff gleich als URL verwenden:
Code:
http://dev.mysql.com/LOWER
http://dev.mysql.com/MD5

Der gleiche Trick ist übrigens auch bei http://www.php.net/ oder http://de.php.net/ zu finden.
 

wapplegraph

Normande
Registriert
12.04.06
Beiträge
571
Es gibt mir mit dieser eien Fehler aus:

Code:
	$sql = "SELECT ID ";
    $sql .= "FROM $tb_ses ";
    $sql .= sprintf("WHERE LOWER($ses_bn) = LOWER('%') ", mysql_real_escape_string($form_s_bn));
    $sql .= sprintf("AND MD5($ses_pwd) = MD5('%')", mysql_real_escape_string($form_s_pwd));
    $sql .= "LIMIT 1";
	
	$query = mysql_query($sql, $con);
	
	
	
	if($sub_admin == 'senden')
	
	{
		if(mysql_num_rows($query) > 0)


Ist mysql_num_rows eine Falsche Abrage? Diese kenne ich eigentlich nicht.


wapplegraph
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Es gibt mir mit dieser eien Fehler aus:

Code:
	$sql = "SELECT ID ";
    $sql .= "FROM $tb_ses ";
    $sql .= sprintf("WHERE LOWER($ses_bn) = LOWER('%') ", mysql_real_escape_string($form_s_bn));
    $sql .= sprintf("AND MD5($ses_pwd) = MD5('%')", mysql_real_escape_string($form_s_pwd));
    $sql .= "LIMIT 1";
	
	$query = mysql_query($sql, $con);
	
	
	
	if($sub_admin == 'senden')
	
	{
		if(mysql_num_rows($query) > 0)


Ist mysql_num_rows eine Falsche Abrage? Diese kenne ich eigentlich nicht.


wapplegraph

Nein, aber Deine Abfrage ist seltsam. Ich glaube, Du hast die Verwendung von sprintf() noch nicht verstanden.

Du schreibst:
Code:
$sql .= sprintf("WHERE LOWER($ses_bn) = LOWER('%') ", mysql_real_escape_string($form_s_bn));

Liebe Kinder, schaut Euch das nicht ab. Einerseits gehört hinter das Prozentzeichen noch der Wertetyp, der eingesetzt wird also 's' für Zeichenkette (string), 'd' für eine ganze Zahl, 'u' für einen Betrag, usw. In diesem Fall muss es zu '%s' zusammengezogen werden.

Und: sprintf() hat in diesem Zusammenhang den Sinn, dass man nicht Ausgabe und PHP-Variablen wild mischt, wie hier:
Code:
sprintf("WHERE LOWER($ses_bn) ...

Auch diesen Wert bitte durch ein %s und einfache Anführungszeichen erstetzen. Richtig ist also:

Code:
$sql .= sprintf("WHERE LOWER('%s') = LOWER('%s') ", mysql_real_escape_string($ses_bn), mysql_real_escape_string($form_s_bn));

Und noch ein Tipp: Sprechende Variablennamen sind echt cool, 'ses_bn' oder 'form_s_bn' sind es jedoch nicht, wenn man nach einem Jahr noch einen Blick drauf werfen möchte ;)
 

b0rsten

Gast
ihr wollt doch nicht allen ernstes das passwort unverschlüsselt in der datenbank speichern?
 
  • Like
Reaktionen: 1 Person