PHP Login geht nicht?
Hallo! Ich habe gestern ein simples Login Script aus dem Web in meine Website eingebaut. jetzt Kann ich mich aufm localhost ganz normal anmelden. Wenn ich die Datein aber aufm lima-city.de Webspace hochlade geht es nicht mehr? Wisst ihr warum das so ist? Also ich bin kompletter php anfänger und habe eigentlich gar keine Ahnung davon.
MFG
Lennart
php-datei= https://pastebin.com/0GjM81fh
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.
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...
Ich habe gerade mal nachgeguckt. Lokal ist es Php 7 und aufm Webspace ist php 5
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;
doch, die define methode gab es auch schon unter php 5. sonst hätte es ja nen fehler diesbezüglich werfen müssen. unabhängig davon, hier der beweis: https://secure.php.net/manual/de/function.define.php
Ach so...Stimmt...Die gab es nur für Array damals noch nicht...
Habe das ganze jetzt mal gemacht und dabei kommt folgendes herraus: https://pastebin.com/xczRJDBW
Moment, hier stimmt was nicht. Handelt es sich bei https://pastebin.com/0GjM81fh um die besagte /home/webpages/lima-city/clientleakz/clientleakz.lima-city.de/login2/login.php Datei?
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.
Ich stelle dir hier einfach mal alle Datein in Pastebin hin. Und die Website ist ja noch nicht richtig public :D
login.php -> https://pastebin.com/uGdM9W8p
login.html -> https://pastebin.com/Hw8rs0Fp
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.
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.
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?
Ich bekomme keine richtige Fehlermeldung. Er sagt mir nur das meine Anmeldedaten nicht richtig sind. Lokal gehen sie aber.
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);
}
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...
Eine andere Möglichkeit wäre, speziell, da es auf deinem Rechner ja funktioniert hat, dass in der php.ini das outputbuffering anders einggestellt ist:
http://php.net/manual/en/outcontrol.configuration.php
Am Besten mal durchprobieren
Was für ein Fehler kommt? Nutzt du auch MySQL
Letzteres lässt sich im Skript nachlesen. Nein, er speichert die Nutzerdaten in einem Array.
Nein MySQL benutze ich nicht. Er gibt mir keinen Error aus sondern sagt nur, dass meine Anmeldedatein nicht richtig sind.
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?