Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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.

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).

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']);

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();

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?

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.

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.

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

stimmt, deswegen hab ich da auch nicht wiedersprochen ;)

aber ich glaube nach einer woche hat der TE auch kein allzugroßes interesse mehr an einer lösung oder hat schon eine ^^

stimmt, deswegen hab ich da auch nicht wiedersprochen ;)

aber ich glaube nach einer woche hat der TE auch kein allzugroßes interesse mehr an einer lösung oder hat schon eine ^^

Das mag natürlich sein :)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.