WinFuture-Forum.de: Login-system Mit Datenbanken - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Login-system Mit Datenbanken Jetzt noch die Accounts


#1 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 352
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 13. Juli 2010 - 13:40

Hallo zusammen,

ich habe mir ein Log-in-System geschreiben mit PHP und HTML und dieses auch bereits erfolgreich auf meinem Server eingesetzt.

Mein System ist im Endeffekt genauso wie nach dieser Anleitung aufgebaut: http://aktuell.de.se...hp/loginsystem/

Also ein Sassionbasiertes Loginsystem, welches ledigtlich 1 Name mit 1 PW mittels einer IF-Abfrage prüft.

Ich würde gerne noch ein paar mehr verschiedenen accounts haben. (z. B. andere Berechtigungen oder abhänig wer sich einloggt wird man woanders hin geleitet.)
Wie ist sowas am einfachsten zu realisieren? (ich denke mal mit Datenbanken oder?)
Wie man eine Datenbank erstellt ect.. weiß ich bzw. habe sogar welche angelegt. Ich brauche also nur den PHP Code oder besser was muss ich ändern.

Meine Login.php:

<?php
	 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	  session_start();

	  $username = $_POST['username'];
	  $passwort = $_POST['passwort'];

	  $hostname = $_SERVER['HTTP_HOST'];
	  $path = dirname($_SERVER['PHP_SELF']);

	  // Benutzername und Passwort werden überprüft
	  if ($username == 'gast' && $passwort == 'geheim') {
	   $_SESSION['angemeldet'] = true;

	   // Weiterleitung zur geschützten Startseite
	   if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
		if (php_sapi_name() == 'cgi') {
		 header('Status: 303 See Other');
		 }
		else {
		 header('HTTP/1.1 303 See Other');
		 }
		}

	   header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');
	   exit;
	   }
	  }
?>


Meines wissens muss ich doch erstmal zu einer Datenbank verbinden, aber wie gehts dann weiter?

Danke schonmal im Vorraus.

Hier mal das aktuelle Loginsystem online: Klick
0

Anzeige



#2 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 14.292
  • Beigetreten: 08. April 06
  • Reputation: 935
  • Geschlecht:Männlich
  • Wohnort:Dortmund NRW
  • Interessen:Alles wo irgendwie Strom durchfließt fasziniert mich einfach weswegen ich halt Elektroinstallateur geworden bin :)

geschrieben 14. Juli 2010 - 10:55

Theo-von-Retisch:

$Abfrage = "SELECT username, passwort FROM [DATENBANKTABELLE] WHERE username LIKE '$username' LIMIT 1";
$Ergebnis = mysql_query($Abfrage);
$row = mysql_fetch_object($Ergebnis);


so wird schonmal geschaut ob der USER existiert... Nachfolgend wird geschaut ob das PW richtig ist

if ($row->passwort == $passwort)
   { $_SESSION["username"] = $username;
	  echo "Kenne dich";
	 # Weitere Abarbeitung hier möglich für erfolgreichen LogIn
  }

else {
	echo "du kommst hier nich rein";
   }


Wichtig ist natürlich dass du möglichst die Kennwörter NICHT im Klartext in der Datenbank speicherst :unsure: Ich meine aber zu wissen, dass es einen MySQL Befehl gibt der generell alles in MD5 ausliest/eingibt.... das ist aber def. nicht meine Baustelle

Habe mit den oberen Code-Snippseln dieses Tut hier für dich versucht aufzudröseln:
http://www.php-einfa...mysql_login.php

Gruß,

Stefan
0

#3 Mitglied ist offline   user2015 

  • Gruppe: aktive Mitglieder
  • Beiträge: 48
  • Beigetreten: 23. August 09
  • Reputation: 0
  • Wohnort:AT

geschrieben 15. Juli 2010 - 07:17

Beitrag anzeigenZitat (Stefan_der_held: 14.07.2010, 11:55)

so wird schonmal geschaut ob der USER existiert... Nachfolgend wird geschaut ob das PW richtig ist




$Abfrage = "SELECT username FROM [DATENBANKTABELLE] WHERE username LIKE '$username' AND passwort = '".md5($passwort)."' ";


Oder man prüft gleich im SQL-Statement ob es die Kombination aus Benutzername + Passwort gibt, so spart man sich die nachträgliche Überprüfung.

Aber für den Anfang ist es so sicher nicht schlecht.
0

#4 Mitglied ist offline   zwutz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 654
  • Beigetreten: 17. Juli 07
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 15. Juli 2010 - 07:49

Warum LIKE? Ihr habt ja den genauen Namen, also ist das unnötig und auch langsamer als ein simpler Vergleich auf Gleichheit

Ansonsten aufpassen vor SQL-Injections!
Raise your glass if you are wrong
0

#5 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 15. Juli 2010 - 09:03

Ich empfehle dir ein fertiges Script zu nehmen.
Das was du hier gebaut hast ist anfällig für XSS, SQL Injections, XSRF Lücken und noch vieles weiteres.
Auch Session Hijacking ist ein Thema, das du noch nicht berücksichtigt hast.

Um SQL und XSS Injections abzufedern solltest du unbedingt Regex benutzen, und dort nur bestimmte Werte zulassen. Meiner Meinung nach einer der besten Wege sich davor zu schützen.
your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#6 Mitglied ist offline   zwutz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 654
  • Beigetreten: 17. Juli 07
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 15. Juli 2010 - 09:23

Beitrag anzeigenZitat (tavoc: 15.07.2010, 10:03)

Ich empfehle dir ein fertiges Script zu nehmen.


Als ob die fertigen Skripte, die durchs Internet schwirren, sicherer wären.
Einen Login kann man auch selber machen. Wenn nicht, sollte man sich aus der Internetprogrammierung raushalten.

Sicherheitslücken erkennen und vermeiden gehört zur Programmierung dazu
Raise your glass if you are wrong
0

#7 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 15. Juli 2010 - 09:28

es gibt vernünftige Scripts. Ich mein jetzt nicht die, die jeder in das Internet stellt, sondern zertifizierte Scripts.

Kommt natürlich drauf an was du machen willst, aber Windows Live Login ist z.b. sehr gut und robust. Die User brauchen allerdings einen Live Login.
Ich benutze das zwar für ASPX aber es gibt auch welche für PHP.


@zwutz ein Entwickler allein kann niemals alle Sicherheitslücken schliessen, denn 100% Sicherheit gibt es nie. Vorallem auch nicht da ein alleiniger Entwickler niemals vernünftig die Softwareentwicklungsphase durchführt, z.b. SDL. Auch hat er in der Regel nicht die Kompetenz alle Angriffsvektoren zu erkennen.
your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#8 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 352
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 15. Juli 2010 - 10:45

okay, aber wenn ich den Code jetzt so einfügen würde dann kann das ja so nicht funktionieren.
Also ich brauche eine Datenbank (beliebigen Name) und eine Tablelle welche oben bei "[DATENBANKTABELLE]" eingegeben wird.
Was muss ich noch hinzufügen? Ich weiß zwar das ich da noch irgentwie eine Verdindung aufbauen muss, weiß aber nicht genau wie. (Bin sozusagen noch PHP anfänger ;)).
Thx schonmal

ps: ja Thema Sicherheit ist indemfall nicht ganz so wichtig. Es handelt sich ledigtlich um einen privaten Server mit nicht allzu sensiblen Daten. Ich mach das mehr zur Vereinfachung, Übung und zum Spaß. :smokin:

Dieser Beitrag wurde von driv3r bearbeitet: 15. Juli 2010 - 10:48

0

#9 Mitglied ist offline   user2015 

  • Gruppe: aktive Mitglieder
  • Beiträge: 48
  • Beigetreten: 23. August 09
  • Reputation: 0
  • Wohnort:AT

geschrieben 15. Juli 2010 - 11:19

Beitrag anzeigenZitat (driv3r: 15.07.2010, 11:45)

ps: ja Thema Sicherheit ist indemfall nicht ganz so wichtig. Es handelt sich ledigtlich um einen privaten Server mit nicht allzu sensiblen Daten. Ich mach das mehr zur Vereinfachung, Übung und zum Spaß. :smokin:

Wenn es nur bei der lokal läuft ist es relativ egal, doch wenn es wirklich "im Internet" ist, dann kann aus so einem Server schnell einmal eine Spam-Schleuder etc. werden
0

#10 Mitglied ist offline   driv3r 

  • Gruppe: aktive Mitglieder
  • Beiträge: 352
  • Beigetreten: 17. Januar 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:NRW

geschrieben 15. Juli 2010 - 11:49

Ja der Server ist aufjedenfall Online. Aber muss ich mir da echt jetzt gedanken machen? Ich werde das ganze erstmal auf Funpic hosten. Im Zweifelsfall einfach mal alle Daten wieder löschen. Hab den Server ja dann auch noch lokal.

Dieser Beitrag wurde von driv3r bearbeitet: 15. Juli 2010 - 11:51

0

#11 Mitglied ist offline   user2015 

  • Gruppe: aktive Mitglieder
  • Beiträge: 48
  • Beigetreten: 23. August 09
  • Reputation: 0
  • Wohnort:AT

geschrieben 15. Juli 2010 - 23:20

Beitrag anzeigenZitat (driv3r: 15.07.2010, 12:49)

Ja der Server ist aufjedenfall Online. Aber muss ich mir da echt jetzt gedanken machen? Ich werde das ganze erstmal auf Funpic hosten. Im Zweifelsfall einfach mal alle Daten wieder löschen. Hab den Server ja dann auch noch lokal.

bei Funpic kann man noch nicht soooo viel Unsinn anstellen, da die Hälfte der "interessanten" Dinge sowieso gesperrt ist, doch wenn die Dinge auf einen richtigen Webserver gehen, sollte man sich schon Gedanken machen.
0

#12 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.701
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 16. Juli 2010 - 08:40

Die zwutz schon angemerkt hat, achte bei deinem Code auf mögliche SQL-Injections. Wenn du sämtliche Benutzereingaben durch mysql_real_escape_string filterst, bist du auf der sicheren Seite.
0

#13 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 16. Juli 2010 - 09:31

mysql_real_escape_string sind keine sichere Methode um SQL Injections auszuschliessen. Dort werden nur bestimmte Chars escaped.
Regex expressions sind da besser, bzw. sollte man zusätzlich benutzen.
your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#14 Mitglied ist offline   zwutz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 654
  • Beigetreten: 17. Juli 07
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 16. Juli 2010 - 09:37

Beitrag anzeigenZitat (tavoc: 16.07.2010, 10:31)

mysql_real_escape_string sind keine sichere Methode um SQL Injections auszuschliessen. Dort werden nur bestimmte Chars escaped.


ja. Eben genau die Zeichen, die vom SQL-Server falsch interpretiert werden könnten

Das man da RegExp verwenden sollte, wär mir neu. Eher noch Stored Procedures

Gut, Whitelist statt Blacklist kann in manchen fällen praktisch sein, aber nicht immer notwendig
Raise your glass if you are wrong
0

#15 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 16. Juli 2010 - 10:00

ach das geht gar nicht mal so schwer. Man kann multi byte encoded strings nehmen, also z.b. asiatische Zeichen. Die FUnktion kann das nicht wirklich und escaped die also nicht:

Zitat

SET NAMES is usually used to switch the encoding from what is default to what the application needs. This is done in a way that mysql_real_escape_string doesn’t know about this. This means if you switch to some multi byte encoding that allows backslash as 2nd 3rd 4th… byte you run into trouble, because mysql_real_escape_string doesn’t escape correctly. UTF-8 is safe…

Safe way to change encoding is mysql_set_charset, but that is only available in new PHP versions



Oder wie wäre es mit folgender Eingabe?

safe.php?id=-1 union select 1,load_file(0x6574632f706173737764)--

ich verwende hier keine Hochkommas oder ähnliches, das heisst es wird nichts escaped. Die Anfrage geht also direkt an die Datenbank, das liegt u.a. daran das ich direkt in HEX die Abfrage mache. Damit wär es mir möglich die etc/passwd zu lesen. Kommt natürlich auf die Struktur der Abfrage drauf an, es geht aber bei vielen Seiten.

Die Idee stammt aus diesem Forum: http://www.megaturks.net/makaleler-354/mys...njection-22274/
http://blog.sc0rpion.ir/2010/01/bypassing-...ring/#more-1035


Und XSS lässt sich mit mysql_real_escape_string auf gar keinen Fall blockieren: http://ha.ckers.org/xss.html
Dort sind viele interessante Abfragen drin, die alle harmlos sind. Aber wie wärs mit einer die die Passwörter der User ausliest, oder des Admins? Alles kein Problem. Hier kann nur Regex helfen...

Ich hab letztens einen Test von verschiedenen Softwarearchitekturen gemacht, und es hat sich herausgestellt, dass nur "defense in depth" hilft. Also sollte man auf allen Ebenen die Sicherheit testen, und die oben genannte Funktion ist halt nicht ausreichend.
Mit Regex könnte man z.b. 0x blocken, oder ähnliche verdächtige Strings. Oder man lässt nur zulässige Werte an die DB.
Interessant ist auch der Einsatz von einer Zwischenschicht, wie z.b. ADO (wieder mal für aspx)
your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0