PHP Login geht nicht?

4 Antworten

Vorerst fallen mir nur Punkte auf, die man besser machen könnte. Zum Beispiel sollte das Skript nach einer Weiterleitung mit header umgehend abgebrochen werden (exit-Funktion) oder da in jedem Fall wohl nur eine einzige Fehlermeldung temporär gespeichert wird, könnte man Array und Schleife dazu rauswerfen.

Aber zu deinem Problem: Prüfe, ob die URLs passen, auf die das Skript verweist und lasse dir Fehlermeldungen ausgeben. Setze dazu folgende Zeilen an den Anfang deines Skripts:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Und setze am besten noch eine Basic Authentication vor die Seite. Es muss ja nicht jeder die Fehlermeldungen mitlesen können.

Fehlende Kompetenzen würde ich dir raten, aufzuholen, bevor du Skripte aus dem Web kopierst. Zumindest bei so heiklen Angelegenheiten wie einem Login.

Kieselsaeure  08.04.2018, 14:22

ich könnte mir vorstellen, dass es mit zeile 40 probleme geben könnte. die session daten speichert php ja in dateien. beim einlesen der dateien könnte es vorkommen, dass sich php nichtmehr daran erinnert, das true und false als bools zu werten sind und als strings interpretiert werden => problem.

warum es lokal funktioniert und aufm webspace nicht könnte ich mir jetzt nur durch variierende php versionen erklären.

was meinst du dazu?

0
Destranix  08.04.2018, 14:27
@Kieselsaeure

Bin zwar nicht gefragt, aber ich halte das auch für am Wahrscheinlichsten, da der Code, sofern er im localhost funktioniert hat, beinahe Idiotensicher ist, außer eben die Sessionvariablen...

Von den benutzten Befehlen sollte eigentlich keiner vom Server her gespeert sein, also ist das wohl auch nicht das Problem...

1
Lennart168 
Fragesteller
 08.04.2018, 14:48
@Destranix

Ich habe gerade mal nachgeguckt. Lokal ist es Php 7 und aufm Webspace ist php 5

0
Destranix  08.04.2018, 14:53
@Lennart168

Die define() Methode gibt es in PHP 5 noch nicht!

Mach daraus Konstanten oder stell die PHP-Version(Falls möglich) um.

define('MD5_ENCRYPT', false);

Wird zu

const MD5_ENCRYPT = false;
0
regex9  08.04.2018, 14:59
@Destranix

Doch doch, Konstanten / define gibt es schon seit PHP 4.

0
Lennart168 
Fragesteller
 08.04.2018, 14:44

Habe das ganze jetzt mal gemacht und dabei kommt folgendes herraus: https://pastebin.com/xczRJDBW

0
Kieselsaeure  08.04.2018, 15:06
@Lennart168

Und die Datei ist auch wirklich 1:1 die selbe, wie auf Pastebin vom Inhalt her..? Das sieht sehr merkwürdig aus. Der beschwert sich, dass session_start() mehrfach aufgerufen wurde, in dem pastebin Script sehe ich aber nur einen Aufruf.. Bist du dir wirklich sicher, dass du die aktuellste Version von deinem Script hier verlinkt hast..?

übrigens.. interessantes Impressum deiner Seite ... :p eines Tages ziehe ich auch mal in die Musterstadt.

0
Kieselsaeure  08.04.2018, 15:15
@Lennart168

Hmm, merkwürdig, rein technisch betrachtet sollte er Zeile 43 respektieren. Du kannst dein session_start(); aber auch mal aus Zeile 43 entfernen und in Zeile 5 einfügen (eine Zeile nach "<?php")

Deine aktuelle Zeile 40, sprich dein

header("Content-Type: text/html; charset=utf-8"); // Melde Browser die verwendete Zeichenkodierung

solltest du sicherheitshalber umformen zu

header("Content-Type: text/html; charset=utf-8", true); // Melde Browser die verwendete Zeichenkodierung

Das sollte eigentlich die 2 Fehlermeldungen, die ich live auf deiner Seite sehe beheben.

0
regex9  08.04.2018, 15:18
@Lennart168

1) Bitte setze die Änderungen um, die bereits in meiner Antwort erwähnt habe.

2) Schiebe den Part

if(!isset($_POST['login'])){
  header('Location: '.LOGIN_FORM_URL);
}

noch vor Zeile 37, setze wie gesagt exit und entferne das Wort else mit seinen Klammern.

3) Schiebe Zeile 37 unter Zeile 70 oder entferne es. Ich denke nicht, dass es notwendig ist.

4) Entferne diesen Part:

// PHP-Session starten und aktuellen Stand abfragen
session_start();
$_SESSION['logged_in'] = (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) ? true : false;
$_SESSION['usr'] = (isset($_SESSION['usr'])) ? $_SESSION['usr'] : '';

du benötigst ihn dort nicht.

0
if($usr != $ud['usr'] || $pwd != $ud['pwd']){
                if(count($error) == 0)
                    $error[] = "Benutzername und/oder Passwort nicht korrekt.";
            }else{
                $_SESSION['logged_in'] = true;
                $_SESSION['usr'] = $usr;
                header('Location: '.SUCCESS_URL);
            }

Für jedes Nutzerkonto, zu dem die Logindaten nicht passen eine Fehlermeldung ausgeben?

Wäre andersherum wohl sinnvoller...

foreach($usrdata as $ud){
if($usr == $ud['usr'] && $pwd == $ud['pwd']){
                 $_SESSION['logged_in'] = true;
                $_SESSION['usr'] = $usr;
                header('Location: '.SUCCESS_URL);
            }
}
 if(count($error) == 0)
                    $error[] = "Benutzername und/oder Passwort nicht korrekt.";

Aber das nur nebenbei...

Bekommst du irgendeine Fehlermeldung?

Oder was genau funktioniert nicht?

Lennart168 
Fragesteller
 08.04.2018, 14:39

Ich bekomme keine richtige Fehlermeldung. Er sagt mir nur das meine Anmeldedaten nicht richtig sind. Lokal gehen sie aber.

0
Destranix  08.04.2018, 14:42
@Lennart168

Wie gesagt gibt dir das Programm, so wie es gestaltet ist, auch dann zurück, dass das Passwort oder der Benutzername falsch waren, wenn das Passwort+Benutzername richtig waren.

Allerdings würdest du in dem Fall ja weitergeleitet werden...

Wenn du den Passworttest so umwandeslst, dass er immer wahr ist, funktioniert es dann?

if($usr != $ud['usr'] || $pwd != $ud['pwd']){
                if(count($error) == 0)
                    $error[] = "Benutzername und/oder Passwort nicht korrekt.";
            }else{
                $_SESSION['logged_in'] = true;
                $_SESSION['usr'] = $usr;
                header('Location: '.SUCCESS_URL);
            }

wird zu

if(false){//$usr != $ud['usr'] || $pwd != $ud['pwd']){
                if(count($error) == 0)
                    $error[] = "Benutzername und/oder Passwort nicht korrekt.";
            }else{
                $_SESSION['logged_in'] = true;
                $_SESSION['usr'] = $usr;
                header('Location: '.SUCCESS_URL);
            }
0

Der Fehler(mit dem Header) könnte evtl. durch Leerzeichen vor den

<?php

ausgelöst werden...

Am Besten mal schauen, dass das ganze Dokument direkt mit

<?php

Anfängt, ohne Leerzeilen oder Leerzeichen davor...

Was für ein Fehler kommt? Nutzt du auch MySQL

regex9  08.04.2018, 14:12

Letzteres lässt sich im Skript nachlesen. Nein, er speichert die Nutzerdaten in einem Array.

0
Lennart168 
Fragesteller
 08.04.2018, 14:39

Nein MySQL benutze ich nicht. Er gibt mir keinen Error aus sondern sagt nur, dass meine Anmeldedatein nicht richtig sind.

0