Entwickler-Ecke
Off Topic - [PHP] Problem mit einfachem Login - Script ...
Supernova - Mi 03.01.07 14:57
Titel: [PHP] Problem mit einfachem Login - Script ...
Hallo,
ich beginne mich mal wieder ein wenig mit PHP zu beschäftigen ... und hab mal Versucht ein Login-Script zu machen ...
index.php
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| <?php
include('login'); if(isset($_GET['logout'])) { unset($_SESSION['success']); header("Location: index.php"); }
?>
<html> <head> <title>Administrations - Login</title> </head> <body margin="5"> <?php if(isset($_SESSION['success'])) { echo "drin<br><a href='index.php?logout=true'>Logout</a>"; }else { ?> <form target="_self" method="post" name="main"> Username: <input type="text" name="username"><br> Password: <input type="text" name="password"><br> <input type="submit" name="sender" value="Login"> </form> <?php } ?> </body> </html> |
login.php
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| <?php
include('mysql_connect.php'); @session_start(); $sql_action = @mysql_query("SELECT user_id FROM tbl_user WHERE username = $username AND password = $password"); if(@mysql_num_rows($sql_action) == 1) { $_SESSION['success'] = true; return true; } else { return false; }
?> |
So wenn ich dass Script teste bekomme ich irg. immer den Wert FALSE zurück ... kann mir da vllt. jemand helfen warum dass so ist ... ^^
Entschuldigt wenn das Script ein wenig unübersichtlich ist ... aber ich komm einfach nicht weiter ^^
Beste Grüße,
Andi
GTA-Place - Mi 03.01.07 15:03
1. Mach erstmal alle @ weg - wir wollen ja keine Fehlermeldungen unterdrücken :lol:.
2. Dann glaube ich, dass return nur in Funktionen geht - du hast es aber in einer If-Abfrage.
3. Ruft dein Formular die index.php auf - du hast aber nirgends die Login.php inkludiert.
Flamefire - Mi 03.01.07 15:25
also...zu dem code brauch ich nix sagen oder?
return nur in funktionen...und die action im formular setzen
vorschlag:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| <?php
include('login[b].php[/b]'); if(isset($_GET['logout'])) { unset($_SESSION['success']); header("Location: index.php"); }
?>
<html> <head> <title>Administrations - Login</title> </head> <body margin="5"> <?php if(isset($_SESSION['success'])) { echo "drin<br><a href='index.php?logout=true'>Logout</a>"; }else { ?> [b]<form method="post" name="main">[/b] Username: <input type="text" name="username"><br> Password: <input type="text" name="password"><br> <input type="submit" name="sender" value="Login"> </form> <?php } ?> </body> </html> |
login.php
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| <?php
if($_POST['sender']!=""){ //nur kontrolle bei neuem formularsenden include('mysql_connect.php'); @session_start(); $sql_action = @mysql_query("SELECT user_id FROM tbl_user WHERE username = $username AND password = $password"); if(@mysql_num_rows($sql_action) == 1) $_SESSION['success'] = true; }//löschen wenn keine kontrolle
?> |
LeoLöwe - Mi 03.01.07 15:29
Dein SQL-Query sieht falsch aus
Ausserdem - wieso packst du nicht die SQL-Abfrage mit in die andere Datei rein?
GTA-Place - Mi 03.01.07 15:31
Query sieht doch richtig aus :shock:
Und dann weis ich dich gleich noch auf die Gefahren von
XXS hin.
Martok - Mi 03.01.07 16:09
Wo kommen denn die Variablen $username und $password her? Die werden doch soweit ich das sehe an keiner Stelle aus den POST-Daten rausgeholt, oder?
Supernova - Mi 03.01.07 16:40
Erstmal besten Danke an alle die mir hier bis jetzt geholfen haben ^^
@GTA ... ich verstehe nich sonderlich viel was du mit XXS meinst, sorry, aber googlen bringt irg auch nix ...
@Martok ... Praktisch muss der Query dann so lauten:
Quelltext
1:
| SELECT user_id FROM tbl_user WHERE username = $_POST['username'] AND password = $_POST['password'] |
Richtig ?
GTA-Place - Mi 03.01.07 16:44
Ist ja auch immer so schwer zu finden, wenn sich jeder XXS nennet :lol: ->
CROSS SITE SCRIPTING (oder gleich:
SQL-INJEKTION)
Ja, richtig, aber guck dir jetzt nochmal XXS an.
Supernova - Mi 03.01.07 17:01
Mhm ... Danke ...
Wenn ich nun diese Funktion einbinde ...
Quelltext
1: 2: 3: 4:
| function check_string($string) { if((preg_match('/^[a-zA-Z0-9\-\_]+$/',$string))) return true; return false; } |
sowie die PHP-Funktion
dürfte das Script doch einigermaßen sicher sein, oder ?
Thanx a lot ...
Andi
Supernova - Mi 03.01.07 19:23
Hallo,
so ich habe jetz nochmal alles komplett überarbeitet ... aber irg. funktioniert das einloggen einfach nicht ... immer bekomme ich den wert FALSE zurück ...
administration_login.php
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| <?php
include('mysql_connect.php'); session_start(); $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username = $_POST["username"] AND password = $_POST["password"]'); if(@mysql_num_rows($sql_action) == 1) { $_SESSION['success'] = true; } else { echo '<center>Login fehlgeschlagen!</center>'; }
?> |
administration_login_form.php
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| <?php
include('administration_login.php'); if(isset($_GET['logout'])) { unset($_SESSION['success']); header('Location: administration_login_form.php'); }
?>
<html> <head> <title>« dieFanz.de | Administrations-Login »</title> </head> <body> <br> <br> <br> <br> <center> <?php if(isset($_SESSION['success'])) { echo "Sie sind eingeloggt.<br><a href='index.php?logout=true'>Logout</a>"; }else { ?> <form target="_self" method="post" name="login"> Benutzername: <input type="text" name="username"> <br> Kennwort: <input type="password" name="password"> <br> <br> <input type="submit" name="transmitter" value="Login"> </form> <?php } ?> </center> </body> </html> |
Ich weis einfach echt nicht mehr was ich falsch mache ... ich vermute es liegt am Query und den $_POST Variablen ...
Beste Grüße,
Andi
Edit:
Die Datenbankstruktur sieht folgendermaßen aus:
Quelltext
1: 2: 3: 4:
| Feld Typ Null Standard Verweise Kommentare MIME user_id int(17) Nein // auto increment, Primärschlüssel username varchar(255) Nein password varchar(255) Nein |
Marco D. - Mi 03.01.07 19:28
Quelltext
1:
| <form target="_self" method="post" name="login"> |
Warum schreibst du bei target nicht den richtigen Dateinamen hin? So mache ich das immer und es klappt. ;) Tue es einfach mal!
Supernova - Mi 03.01.07 19:32
@Marco D. ... eig. ist es ja sinnlos, weil mit _SELF ja das obere script aufgerufen wird, und das hat ja die Datei includet ...
Marco D. - Mi 03.01.07 19:35
Probiere mal den Query manuell in phpMyAdmin auszuführen. Außerdem solltest du die Werte im Query in Anführungszeichen setzen (z.B. WHERE username='$username' ...=
Martok - Mi 03.01.07 19:37
Aha! Da hast du das falsche Attribut. Target gibt an, in welchem Frame die Seite aufgemacht werden soll.
Quelltext
1: 2: 3: 4:
| <form target="_self" method="post" name="login"> | V <form action="administration_login.php" method="post" name="login"> |
Marco D. - Mi 03.01.07 19:39
Martok hat folgendes geschrieben: |
Aha! Da hast du das falsche Attribut. Target gibt an, in welchem Frame die Seite aufgemacht werden soll.
Quelltext 1: 2: 3: 4:
| <form target="_self" method="post" name="login"> | V <form action="administration_login.php" method="post" name="login"> | |
:autsch: Dass mir das nicht auffällt. :autsch:
Martok - Mi 03.01.07 19:46
Dein Unterbewusstsein hat das gemerkt, denn du hast ja oben von diesem Attribut geschrieben ;)
Habs auch nur wegen deinem Kommentar gesehen :mrgreen:
Marco D. - Mi 03.01.07 19:47
Martok hat folgendes geschrieben: |
Dein Unterbewusstsein hat das gemerkt, denn du hast ja oben von diesem Attribut geschrieben ;)
Habs auch nur wegen deinem Kommentar gesehen :mrgreen: |
Es kam mir gleich sehr verdächtig vor. :zwinker:
Flamefire - Mi 03.01.07 19:47
FALSCH!!! Es kann gar nicht gehen! dein mysql-query ist falsch. so muss er heißen:
Quelltext
1:
| $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"'); |
ansonsten sucht er statt nach dem namen nach der zeichenkette
$_POST["username"]
nicht nach dem inhalt davon!
Marco D. - Mi 03.01.07 19:49
Flamefire hat folgendes geschrieben: |
FALSCH!!! Es kann gar nicht gehen! dein mysql-query ist falsch. so muss er heißen:
Quelltext 1:
| $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"'); |
ansonsten sucht er statt nach dem namen nach der zeichenkette $_POST["username"]
nicht nach dem inhalt davon! |
Entweder so, oder:
Quelltext
1:
| $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username="$_POST[username]" AND password="$_POST[password]"'); |
GTA-Place - Mi 03.01.07 20:11
Flamefire hat folgendes geschrieben: |
FALSCH!!! Es kann gar nicht gehen! dein mysql-query ist falsch. so muss er heißen:
Quelltext 1:
| $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"'); |
ansonsten sucht er statt nach dem namen nach der zeichenkette $_POST["username"]
nicht nach dem inhalt davon! |
Nein, sucht er nicht :zwinker:
Flamefire - Mi 03.01.07 20:23
GTA-Place hat folgendes geschrieben: |
Flamefire hat folgendes geschrieben: | FALSCH!!! Es kann gar nicht gehen! dein mysql-query ist falsch. so muss er heißen:
Quelltext 1:
| $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"'); |
ansonsten sucht er statt nach dem namen nach der zeichenkette $_POST["username"]
nicht nach dem inhalt davon! |
Nein, sucht er nicht :zwinker: |
Doch sucht er :wink:
probiers aus
das gaze würde sorum gehen
Quelltext
1:
| $sql_action = mysql_query("SELECT user_id FROM administration_user WHERE username ='$_POST['username']' AND password = '$_POST['password']'"); |
und möglicherweise nicht mal so (ich glaub bei array müssen noch {} drum rum)
-->Merke: In Strings mit "" ersetzt er Variablen
In Strings mit '' nicht!
Supernova - Mi 03.01.07 23:10
Bei dem Query von Flamefire bekomm ich folgenden error:
Quelltext
1:
| Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\Programme\*\administration_login.php on line 6 |
Sry ^^
LeoLöwe - Mi 03.01.07 23:45
Was hab ich euch gesagt... Query is falsch... Aber neeee auf mich hört ja kener
Egal.
Also wenn du später mal längere Abfragen aufbaust empfehle ich dir eine andere Struktur zu wählen:
z.b. machst du das in deinem Fall dann so
SELECT user_id FROM administration_user WHERE username = $_POST["username"] AND password = $_POST["password"]
=>>>>
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| $sql = "SELECT user_id FROM administration_user WHERE username = '"; $sql .= $_POST['username']; $sql .= "' AND password= '"; $sql .= $_POST["password"]; $sql .= "';";
//zum debuggen: //echo $sql;
$sql_action = mysql_query($sql); |
Das Debug-Query lass dir mal ausgeben und gib das mal von Hand in PHPMyAdmin ein.
Viel Glück!
Supernova - Mi 03.01.07 23:58
Jaaaa ... Vielen Dank an Alle ... es Funktioniert :D
Flamefire - Fr 05.01.07 08:20
du kannst meinen auch benutzen aber:
Quelltext
1:
| $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"]'.'"'); |
|
|
|
Quelltext
1:
| $sql_action = mysql_query('SELECT user_id FROM administration_user WHERE username ="'.$_POST["username"].'" AND password = "'.$_POST["password"].'"'); |
da war hinten ein hochkomma zuviel...
matze.de - Fr 05.01.07 11:41
Wie wärs ma mit sowas:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| [...] $user = mysql_real_escape_string($_POST["username"]); $pw = mysql_real_escape_string($_POST["password"]);
$sql = "SELECT `user_id` FROM `administration_user` WHERE `username` = '$user' AND password = '$pw'"; $result = mysql_query($sql); [...] |
Aber Passwörter gehören normalerweise gehasht in eine Datenbank....
mfg matze
Marco D. - Fr 05.01.07 14:41
matze.de hat folgendes geschrieben: |
Wie wärs ma mit sowas:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| [...] $user = mysql_real_escape_string($_POST["username"]); $pw = mysql_real_escape_string($_POST["password"]);
$sql = "SELECT `user_id` FROM `administration_user` WHERE `username` = $user AND password = $pw"; $result = mysql_query($sql); [...] |
Aber Passwörter gehören normalerweise gehasht in eine Datenbank....
mfg matze |
Warum setzt du die Werte der Datenfelder nicht in Anführungszeichen?
Quelltext
1:
| $sql = "SELECT `user_id` FROM `administration_user` WHERE `username` = '$user' AND 'password' = '$pw'"; |
LeoLöwe - Fr 05.01.07 15:06
Zur krönung noch ein
$user = md5($user);
da einbauen 8)
Marco D. - Fr 05.01.07 15:08
Wenn ich aber ein langes Kennwort mit Sonderzeichen und Zahlen habe, dann dauert es sehr sehr lange, das zu knacken. ;)
Flamefire - Fr 05.01.07 15:44
willst du es knacken? wenn nicht dann benutz md5!
oder jeder dern bissl hacken kann kriegt alle deine pws
PS: und natürlich: md5($pw) nicht md5($user)...den usernamen zu verschlüsseln ist dumm...den brauchste ja noch im klartext
Marco D. - Fr 05.01.07 15:46
Flamefire hat folgendes geschrieben: |
willst du es knacken? wenn nicht dann benutz md5!
oder jeder dern bissl hacken kann kriegt alle deine pws
PS: und natürlich: md5($pw) nicht md5($user)...den usernamen zu verschlüsseln ist dumm...den brauchste ja noch im klartext |
Da liegt ein Missverständnis vor. ;) Mein Post bezog sich auf den von LeoLöwe (einer davor), der aber wieder editiert wurde, also mein Post damit überflüssig wird. :zwinker:
BenBE - Mo 08.01.07 21:25
Darf ich den Thread-Ersteller bitte um Schadensersatz bitten, dass ich überhaupt weitergelesen habe? Bei so vielen Fehlern wird einem ja schon schlecht *g*
Die Sache wie man sich gegen XSS schützt, hat Matze.de korrekt gesagt ... Ferner sollte man generell ohne @ programmieren (wurde auch erwähnt). Die Eingabe-Daten sollten IMMER explizit aus den Arrays $_POST und $_GET gelesen werden - inzwischen mehrfach angedeutet, aber noch nicht so richtig umgesetzt ...
Ferner wird in dieser Datei nirgends die verwendete Session mit session_start initialisiert, geschweige denn korrekt gelöscht (beim logout).
Auch kann ich bei dieser Login\Logout-Page keinerlei Schutz gegen
XSRF-Angriffe erkennen. Bitte DRINGEND nachholen, sonst endest Du wie Google, wo Dir jeder einen Link unterjubeln kann, der die Default-Interface-Sprache auf japanisch einstellt ... (Funktioniert wirklich, hab's mal getestet :P).
Ferner habe ich in diesem Thread noch keinen gesehen, der die Rückgaben der Datenbank-Abfragen prüft ... @matze.de: Auch wenn Du da bei BattleArms nicht viel zu tun hast - bei reinem PHP solltest Du da noch etwas stärker drauf achten!!!
Fazit: Bisher würde ich keinen der gebrachten Vorschläge auf meinen Server loslassen - nicht mal im Safe-Mode*!!!
*Der auch nicht wirklich was bringt ...
Marco D. - Mo 08.01.07 22:54
BenBE hat folgendes geschrieben: |
Ferner wird in dieser Datei nirgends die verwendete Session mit session_start initialisiert, geschweige denn korrekt gelöscht (beim logout). |
Wie wird sie denn 'korrekt gelöscht'?
Ich mache das so:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| // gibt true zurück, wenn der User eingeloggt ist // gibt false zurück, wenn der User nicht eingeloggt ist function IsLoggedIn() { if (empty($_SESSION['name'])) return false; else return true; }
//loggt den User aus und entfernt alle $_SESSION-Variablen function Logout() { $_SESSION['name'] = ''; $_SESSION['id'] = ''; $_SESSION['language'] = ''; $_SESSION['ip'] = ''; } |
BenBE hat folgendes geschrieben: |
Fazit: Bisher würde ich keinen der gebrachten Vorschläge auf meinen Server loslassen - nicht mal im Safe-Mode*!!! |
Warum nicht?
BenBE - Mo 08.01.07 23:06
Marco D. hat folgendes geschrieben: |
BenBE hat folgendes geschrieben: | Ferner wird in dieser Datei nirgends die verwendete Session mit session_start initialisiert, geschweige denn korrekt gelöscht (beim logout). |
Wie wird sie denn 'korrekt gelöscht'? |
Bitte nimm mir den Kommentar nicht übel, aber
RTFM [
http://php.net/manual/en/ref.session.php]
soll [
http://php.net/session_cache_expire]
manchmal [
http://php.net/session_start]
helfen [
http://php.net/session_destroy] ;-)
Marco D. hat folgendes geschrieben: |
Ich mache das so:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| // gibt true zurück, wenn der User eingeloggt ist // gibt false zurück, wenn der User nicht eingeloggt ist function IsLoggedIn() { if (empty($_SESSION['name'])) return false; else return true; }
//loggt den User aus und entfernt alle $_SESSION-Variablen function Logout() { $_SESSION['name'] = ''; $_SESSION['id'] = ''; $_SESSION['language'] = ''; $_SESSION['ip'] = ''; } | |
Wenn man schon die Session-Verwaltung von PHP verwendet, dann sollte man sie auch korrekt abfragen ... Sehe ich in keiner deiner beiden funktionen ...
Marco D. hat folgendes geschrieben: |
BenBE hat folgendes geschrieben: |
Fazit: Bisher würde ich keinen der gebrachten Vorschläge auf meinen Server loslassen - nicht mal im Safe-Mode*!!! |
Warum nicht? |
Da bisher kaum konstruktive Vorschläge in den betroffenen Quelltext übernommen wurden und ich mich zusammenreißen musste, um dich nicht gleich heimzusuchen :P
Marco D. - Mo 08.01.07 23:11
Ok. Schaue ich mir bei Gelegenheit mal an. ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!