Zum Inhalt springen

php Login mit Sessions


Empfohlene Beiträge

Hey,

Ich habe ein Login formular (index.php)

<form action="./index.php" method="post">
Username:<input name="username">
Passwort:<input name="passwort" type="password">
<input type="submit" value="Login">
</form>[/PHP]

Und der php-Teil:

[PHP]<?php
If($_SERVER['REQUEST_METHOD'] == 'POST'){
If(isset($_POST['username']) AND isset($_POST['passwort'])){

$username = $_POST['username'];
$passwort = md5($_POST['passwort']);

//MySQL-Connect
include('../db_user_connect.php');
$query = "SELECT * FROM `User`";
$result = mysql_query($query);

$i = 0;
while ($row = mysql_fetch_array($result))
{
If($row[username] == $username AND $row[md5] == $passwort AND $row[mode] == 777){
$id = $row[id];
$username = $row[username];
$md5 = $row[md5];
$mode = $row[mode];
$i = $i + 1;
echo "id: ".$id."<br>Username: ".$username."<br>md5: ".$md5."<br>Mode: ".$mode;
}

}

If($i == 1){
echo "Willkommen $username , einen Moment sie werden weitergeleitet!";

// Sessionvariablen erstellen und registrieren
echo "Sessions registrieren";
$_SESSION["user_id"] = $id;
$_SESSION["usernamen"] = $usernamen;
$_SESSION["mode"] = $mode;
mysql_close();
header("Location: ./panel.php");

}
else{
echo "Falsche Benutzerdaten!";
}
}
}
?>

Am Anfang der Seite wird noch zusätzlich die Checkuser.php included

Checkuser.php

<?php
session_start();
if(!isset($_SESSION["username"]))
{
header ("Location: ./index.php");
}
?>[/PHP]

Mein Problem ist jetzt, wenn ich mich einlogge, passiert gar nichts.

Die Seite wird neu geladen etc... aber sonst nicht mehr und ich bin wirklich am Verzweifeln bei der Fehlersuche :/

Hoffe ihr findet was.

Mfg Cartman

Bearbeitet von cartman1991
Link zu diesem Kommentar
Auf anderen Seiten teilen

Soweit wie ich das sehe, sind schon einige Syntaxfehler drin: Anstatt If muss es if heißen. Weiterhin liefert das mysql_fetch_array ein assoziatives Array, wobei die Namen als Stringwerte übergeben werden.

Schau bitte in Deine Logs, dort müssten Warning und Fehler zu finden sein, die Du zuerst beheben solltest. Weiterhin ist die Meldung "funktioniert nicht", absolut unbrauchbar, denn niemand kann aus dem Code etwas herausfinden bzw. etwas mit dieser Aussage anfangen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soweit wie ich das sehe, sind schon einige Syntaxfehler drin: Anstatt If muss es if heißen.

Sollte allerdings keine Probleme hervor rufen. PHP meckert da imho nicht.

Weiterhin liefert das mysql_fetch_array ein assoziatives Array, wobei die Namen als Stringwerte übergeben werden.

Solange sein Felder richtig benannt sind ("id", "username" etc.) sollte PHP auch hier nicht meckern.

Wenn auch beide Sachen kein schönes Syntax ergeben.

Zum eigentlichen Thema:

Dein Login-Algorithmus ist schon etwas merkwürdig.

Mal aufgebröselt macht dein PHP Skript folgendes:

  1. Wurde ein POST-Formular übergeben/abgesendet
  2. Wurden die Input-Elemente mit den Namen "username" und "passwort" übergeben
  3. Mysql Connect (was auch immer in der Datei passwirt)
  4. ->Mysql Abfrage nach allen Usern
  5. ->Schleife durch alle User
  6. ->Wenn Username und Password und Modus übereinstimmen, setze einige Variablen
  7. ->Inkrementiere $i um 1
  8. Wenn i == 1 dann setze einige Variablen für den Login

Was fällt auf?

Sobald du mehr User als einen als Ergebnis deiner Datenbank abfrage rausbekommst, dann wird $i nie 1 sein.

Sprich ein User kann nie eingeloggt werden.

Weiterhin ist auch die Abfrage nach allen Usern merkwürdig.

Einfacher ist es, wenn du direkt eine Mysql Abfrage nach einem User bestehend aus diesem Usernamen, Passwort und Modus machst. Und die Ergebnismenge nur zählen lässt.

Zu beachten ist bei der zusammengebastelten SQL-Abfrage, dass du alle Werte die der User eingibt (Username, Passwort) mittels mysql_real_escape_string maskierst. Dadurch verhindest du, hinreichend, SQL-Injections.

Wenn die Ergebnismenge 1 ergibt, ist der Userlogin okey.

Ergibt sie 0 stimmt die Kombo aus User+PW+Mode nicht.

Ergibt sie >1 hast du redundante Einträge in der Datenbank.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn die Ergebnismenge 1 ergibt, ist der Userlogin okey.

Ergibt sie 0 stimmt die Kombo aus User+PW+Mode nicht.

Ergibt sie >1 hast du redundante Einträge in der Datenbank.

Letzteres würde meines Erachtens für einen Fehler in der Modellierung sprechen, denn ein Username sollte unique sein, d.h. bei der Datenbankabfrage reicht die Prüfung auf die Existenz des Datensatzes anhand Username und Passwort (ich hoffe, dass das Passwort nicht im Klartext sondern als Hash gespeichert ist).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Letzteres würde meines Erachtens für einen Fehler in der Modellierung sprechen

Dito.

In wie weit man sich jetzt auf sein Modell verlässt und deswegen bestimmte Abfragen/Else-Zweige nicht ausbaut bleibt einem selbst überlassen.

ich hoffe, dass das Passwort nicht im Klartext sondern als Hash gespeichert ist

Laut seinem ersten Beitrag schon:

$passwort = md5($_POST['passwort']);
Link zu diesem Kommentar
Auf anderen Seiten teilen

Solange sein Felder richtig benannt sind ("id", "username" etc.) sollte PHP auch hier nicht meckern.

er benutzt aber keine strings, sondern nicht definierte konstanten: $row[md5]

das funktioniert zwar dummerweise, aber nur weil php "annimmt" die konstante md5 soll auch den string md5 enthalten.

normalerweise sollte php dann mit warnings um sich werfen.

->Wenn Username und Password und Modus übereinstimmen, setze einige Variablen

->Inkrementiere $i um 1

das $i wird aber nur inkrementiert, wenn pass,username und mode stimmen

wäre also erstmal nicht das problem.

viel interessanter ist die frage ob das alles aus der index.php ist, und wo genau die checkuser.php angeblich eingebuden wird.

in checkuser.php wird auf existens der session variablen 'username' geprüft, die wird aber nie gesetzt. in der index.php wird eine sessionvariable 'usernamen' gesetzt. und in der index.php so wie sie da steht fehlt auch ein session_start();

Link zu diesem Kommentar
Auf anderen Seiten teilen

er benutzt aber keine strings, sondern nicht definierte konstanten: $row[md5]

das funktioniert zwar dummerweise, aber nur weil php "annimmt" die konstante md5 soll auch den string md5 enthalten.

normalerweise sollte php dann mit warnings um sich werfen.

Jap, stimmt. Warnings gibt's dann natürlich.

das $i wird aber nur inkrementiert, wenn pass,username und mode stimmen

wäre also erstmal nicht das problem.

Stimmt, siehe flashpixx sollte man wohl konzeptmäßig nicht davon ausgehen das es redundante User-Einträge gibt.

in checkuser.php wird auf existens der session variablen 'username' geprüft, die wird aber nie gesetzt. in der index.php wird eine sessionvariable 'usernamen' gesetzt.

Stimmt auch, habe ich überlesen. Entweder ein Logik-Fehler ($usernamen = Summe aus allen $username's in Schleife, ähm ja...) oder nur ein Typo, wobei dann ein Doppelter:

$_SESSION["usernamen"] = $usernamen;

und in der index.php so wie sie da steht fehlt auch ein session_start();

Daran könnte es natürlich liegen. Gibt PHP Warnings in Fällen das man $_SESSION setzt, aber gar keine Session gestartet ist, oder wird einfach nichts Aufruf-übergreifend gespeichert und könnte so zu seinem Problem führen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gibt PHP Warnings in Fällen das man $_SESSION setzt, aber gar keine Session gestartet ist, oder wird einfach nichts Aufruf-übergreifend gespeichert und könnte so zu seinem Problem führen?

gute frage, weiß ich nicht, is mir auch zu blöd das jetzt zu testen :D

aber prinzipiell glaub ich nicht das php da warnings wirft, $_SESSION is ja auch nur eine superglobal wie _POST oder _GET. und die sind ja auch immer da.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gut, also vermuten wir - ich, ohne es weiter für cartman1991 zu testen, dass es an einer nicht korrekt per PHP: session_start - Manual gestarteten Session liegt.

Zu überdenken ist die Herangehensweise des Ladens und manuellen Verarbeitens der User dennoch.

Siehe mein Beitrag, wäre ein SQL-Query mit WHERE-Klausel wohl geeigneter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...