Problem mit meiner PHP-Homepage

  • Ersteller Ersteller LastChaosTyp
  • Erstellt am Erstellt am
Richtig, ich habe das im letzten Post editiert, da hast du anscheinend an der Antwort geschrieben :D Ja, "password" hieß in der DB zB. "passwort". Das kam mehr mals vor :D Deswegen habe ich das geändert und es klappt nun tadellos. Bleibt nur noch der Fehler beim Restart von MySQL (siehe Screenshot vom vorherigen Post)
 
mysql config files verwenden "clauses" (weil mir der deutsche Begriff nicht einfällt), gekennzeichnet durch die vorangestellten "group header". Ohne die ist es halt ein Formatfehler im config file. Z. B.
Code:
[mysqld]
Blabla = blablub
Welchen Du jetzt brauchst, da könnte ich aber selbst nur raten. Probiere mal den von mir genannten. Wenn's damit nicht geht, wirst Du wohl die verlinkte Seite lesen müssen ...
 
Zuletzt bearbeitet:
Hi,
habe eine neue Frage, da ich jetzt weiter an der Hp arbeiten wollte :D Ich habe je das Passwort per sha512 verschlüsselt. Wie sollte ich das jetzt mit dem Login machen? Mir fallen spontan 2 Varianten ein:

1.) Die Benutzereingabe beim Login ebenfalls per sha512 und dem selben Salt verschlüsseln und dann mit der DB vergleichen
2.) Das Passwort aus der DB nehmen und zurück entschlüsseln. Wie geht das denn genau?

Code:
$salt = "#sf$!\"\"\asd³s²a~§653 sad75qAa@üeX";   (Wurde hier leicht verändert ;) )
$password = ($_POST['password']);
$passwordHash = hash('sha512', ($password).$salt);

Welche Variante ist denn besser und theoretisch sicherer?
 
Der Secure Hash Algorythm (sha) ist eine Einwegsverschlüssellung. Entschlüsseln ist da nicht. Du nimmst die Eingabe, hash'ed sie und vergleichst es mit dem Hash in der Datenbank. Stimmt der genau überein, dann war der Login erfolgreich.
 
Okay, so habe ich mir das schon gedacht :D Jetzt wieder ein Problem:

Die Weiterleitung der Daten aus meiner login.php an die loginAuswertung.php klappt wunderbar, allerdings klappt meine SQL-Abfrage in der loginAuswertung.php nicht :/

Code:

login.php
Code:
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Login - LastChaosTyp</title>
        <meta charset='UTF-8' />
    </head>
    <body> 
        <h2>Login</h2>
        <a href="index.php">Startseite</a>
        <form action="loginAuswertung.php" method="post">
        <table width="50%" border="0px" cellspacing="5px" cellpadding="5px">
            <tr><td>Benutzername: </td><td><input type="text" name="username" size="45"></td></tr><br>
            <tr><td>Passwort: </td><td><input type="text" name="password" size="45"></td></tr><br>
            <tr><td> </td><td><input type="submit" value="Weiter"><input type="reset" value="Reset" name="reset"/></td></tr>
        </table>
        </form>
    </body>
</html>

loginAuswertung.php
Code:
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Login - LastChaosTyp</title>
        <meta charset='UTF-8' />
    </head>
    <body>
        <?php 
            session_start(); 
        ?> 
        <?php
            error_reporting(E_ALL);
            
            define('MYSQL_HOST', '127.0.0.1');
            define('MYSQL_USER', 'root');
            define('MYSQL_PASS', 'PASSWORT');
            define('DATABASE', 'user');
            
            $db = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, DATABASE);
            if ($db->connect_errno) {
                echo "Verbindung zur Datenbank konnte nicht hergestellt werden: (" . $db->connect_errno . ") " . $db->connect_error;
            } else {
                if (isset($_POST['username'], $_POST['password']) and trim($_POST['username']) != "" and trim($_POST['password']) != "") {
                    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
                    $username = $_POST["username"];
                    $password = $_POST["password"];
                    $passwordHash = hash('sha512', ($password).$salt);                        
                    $passwordDB = mysqli_query($db, "SELECT passwort FROM benutzer WHERE benutzername='".$username."'");
                    // Test-Ausgaben:
                    echo "User: $username";
                    echo "PW: $password";
                    echo "Hash: $passwordHash";
                    echo "DB: $passwordDB";
                    echo "DB:";
                    
                    if ($passwordHash == $passwordDB) {
                        $_SESSION["username"] = $username;
                        echo "<h2>Login war erfolgreich! <a href=user.php>Weiter</a></h2>";
                    } else {
                        echo "<h2>Passwort ungültig! <a href=login.php>Zurück</a></h2>";
                    }
                } else {
                    echo "<h2>Leere Angaben sind nicht zulässig! <a href=login.php>Zurück</a></h2>";
                }
            }
        ?>
    </body>
</html>

Bei meiner Ausgabe von loginAuswertung.php fehlen dann aber 2 Testausgaben(siehe Quellcode), nämlich theoretisch alles ab
Code:
echo "DB: $passwordDB";
Weiß einer, warum das so ist? Ich habe mir mal die SQL-Abfrage 1:1 rauskopiert und den Benutzernamen manuell eingegeben: Bei PhpMyAdmin hat die Ausgabe wunderbar geklappt, dort wird also vermutlich nicht der Fehler liegen :( Würde ich keine Test-Ausgaben machen, wäre bei mir nur eine komplett weiße Seite ohne Quellcode. Wo ist denn da der Fehler? Ich sehe ich auch nach 30 Minuten immernoch nicht....
 
Soweit ich mich erinnere, bekommst du bei einem Query nur eine Resultat-Referenz zurück. Du müsstest das Ergebnis noch fetchen.
 
Danke für den Hinweis, hatte ich in der "Eile" vergessen :D Jetzt funktioniert es! Kommt das nächste Problem:
Ich will nen Datei-Manager, aber da probiere ich erstmal rum, denn ich lerne am besten durch LearningByDoing ;) Habe da auch schon was ganz schönes gefunden, muss es "nurnoch" integrieren...
 
Naja Filemanagement auf dem Server ist kein Hexenwerk. Das sollte kein Thema sein ;)
 
Habe mir mal Cute File Browser with jQuery and PHP | Tutorialzine angeschaut. Sieht echt schick aus, ich weiß leider nur noch nicht, wie ich das genau einbinden soll :D Ich würde das ganze gerne in meinen User-Bereich, also nach dem Login, packen. Dafür sperre ich diesen Bereich mit einer Session ab, die mit einer If-Abfrage abgesichert ist. Nebenbei habe ich noch eine WhiteList eingebaut, damit sich nicht jeder einen Account erstellen kann und auf meine Daten zugreifen kann :D Bisher sieht das ganze so aus:

loginAuswertung.php
Code:
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Login - LastChaosTyp</title>
        <meta charset='UTF-8' />
    </head>
    <body>
        <?php 
            session_start(); 
        ?> 
        <?php
            error_reporting(E_ALL);
            
            define('MYSQL_HOST', '127.0.0.1');
            define('MYSQL_USER', 'root');
            define('MYSQL_PASS', 'PASSWORT');
            define('DATABASE', 'user');
            
            $db = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, DATABASE);
            if ($db->connect_errno) {
                echo "Verbindung zur Datenbank konnte nicht hergestellt werden: (" . $db->connect_errno . ") " . $db->connect_error;
            } else {
                if (isset($_POST['username'], $_POST['password']) and trim($_POST['username']) != "" and trim($_POST['password']) != "") {
                    
                    $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";                                                                               
                    
                    // Username
                    $username = $_POST["username"];
                    $whitelist = mysqli_fetch_assoc(mysqli_query($db, "SELECT benutzername FROM whitelist WHERE benutzername LIKE '".$username."'"));
                    if (($whitelist["benutzername"] != NULL) AND ($whitelist["benutzername"] != "")) {  

                        // Passwort
                        $password = $_POST["password"];
                        $passwordHash = hash('sha512', ($password).$salt);                        
                        $passwordDBResult = mysqli_query($db, "SELECT passwort FROM benutzer WHERE benutzername='".$username."'");
                        $passwordFetch = mysqli_fetch_assoc($passwordDBResult);
                        $passwordDB = $passwordFetch["passwort"];
                        if ($passwordHash == $passwordDB) {
                            $_SESSION["username"] = $username;
                            echo "<h2>Login war erfolgreich! <a href=user.php>Weiter</a></h2>";
                        } else {
                            echo "<h2>Passwort ungültig! <a href=login.php>Zurück</a></h2>";
                        }
                        
                    } else {
                        echo "<h2>Dieser Benutzer ist nicht von einem Administrator zugelassen! Bitte kontaktiere einen Administrator.</h2>";
                    }
                } else {
                    echo "<h2>Leere Angaben sind nicht zulässig! <a href=login.php>Zurück</a></h2>";
                }
            }
        ?>
    </body>
</html>

user.php (Das ist der abgesicherte Bereich)
Code:
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Userbereich - LastChaosTyp</title>
        <meta charset='UTF-8' />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
        <link href="assets/css/styles.css" rel="stylesheet"/>
    </head>
    <body> 
        <h2>Downloads</h2>
        <?php 
            session_start();
            
            if(!isset($_SESSION["username"])) { 
                echo "Bitte erst <a href=login.php>einloggen</a>!"; 
                exit; 
            } else {
                <div class="filemanager">
                    <div class="search">
                        <input type="search" placeholder="Find a file.." />
                    </div>
                    <div class="breadcrumbs"></div>
                    <ul class="data"></ul>
                    <div class="nothingfound">
                        <div class="nofiles"></div>
                        <span>No files here.</span>
                    </div>
                </div>

                <footer>
                    <a class="tz" href="http://tutorialzine.com/2014/09/cute-file-browser-jquery-ajax-php/">Cute File Browser with jQuery, AJAX and PHP</a>
                    <div id="tzine-actions"></div>
                    <span class="close"></span>
                </footer>

                <!-- Include our script files -->
                <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
                <script src="assets/js/script.js"></script>
            }
        ?>
    </body>
</html>


Es funktioniert alles bis zu dem Teil nach dem Login, also wenn ich auf user.php bin. Da habe ich leider wieder nur Whitescreen :/ Ich habe probiert, die index.html von der DownloadSeite in meine user.php zu integrieren, hat aber wohl nicht ganz hingehauen und nun bin ich, mal wieder :D, ratlos. Ich kopier hier grad noch mal die Orginal-Index-Seite hin, die ich integrieren will:

index.html
Code:
<!DOCTYPE html>
<html>
<head lang="en">
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

	<title>Cute file browser</title>


	<!-- Include our stylesheet -->
	<link href="assets/css/styles.css" rel="stylesheet"/>

</head>
<body>

	<div class="filemanager">

		<div class="search">
			<input type="search" placeholder="Find a file.." />
		</div>

		<div class="breadcrumbs"></div>

		<ul class="data"></ul>

		<div class="nothingfound">
			<div class="nofiles"></div>
			<span>No files here.</span>
		</div>

	</div>

	<footer>
        <a class="tz" href="http://tutorialzine.com/2014/09/cute-file-browser-jquery-ajax-php/">Cute File Browser with jQuery, AJAX and PHP</a>
        <div id="tzine-actions"></div>
        <span class="close"></span>
    </footer>

	<!-- Include our script files -->
	<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
	<script src="assets/js/script.js"></script>

</body>
</html>
 
Du hast ein
Code:
?>
an der falschen Stelle, wodurch dein ganzer HTML-Code als PHP-Code interpretiert wird. Normalerweise müsstest du aber dabei einen ordentlichen Error bekommen und keine Whitepage.
 
Welches ?> Meinst du denn?

In PHP-Dateien muss der HTML-Code außerhalb des <?php ?> Blocks stehen. Bei dir steht er drin. Du musst nach dem Else und der geschweiften Klammer den PHP-Block schließen und am Ende die letzte geschweifte Klammer wieder in einen PHP-Block einschließen. Bin gerade leider am Handy und kann das nicht präziser schildern.

NACHTRAG: So jetzt sitze ich an einem PC und kann präziser werden ;)
Code:
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Userbereich - LastChaosTyp</title>
        <meta charset='UTF-8' />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
        <link href="assets/css/styles.css" rel="stylesheet"/>
    </head>
    <body> 
        <h2>Downloads</h2>
        <?php 
            session_start();
            
            if(!isset($_SESSION["username"])) { 
                echo "Bitte erst <a href=login.php>einloggen</a>!"; 
                exit; 
            } else {
         [COLOR=#ff0000][B]?>[/B]                <div class="filemanager">
                    <div class="search">
                        <input type="search" placeholder="Find a file.." />
                    </div>
                    <div class="breadcrumbs"></div>
                    <ul class="data"></ul>
                    <div class="nothingfound">
                        <div class="nofiles"></div>
                        <span>No files here.</span>
                    </div>
                </div>

                <footer>
                    <a class="tz" href="http://tutorialzine.com/2014/09/cute-file-browser-jquery-ajax-php/">Cute File Browser with jQuery, AJAX and PHP</a>
                    <div id="tzine-actions"></div>
                    <span class="close"></span>
                </footer>

                <!-- Include our script files -->
                <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
                <script src="assets/js/script.js"></script>
        [COLOR=#ff0000][B]<?php[/B]            }
        ?>
    </body>
</html>
Ich habe mal die betroffenen Stellen in rot markiert. Die beiden Stellen hast du vergessen ;)
 
Zuletzt bearbeitet:
Ah, dachte immer, dass man HTML-Code einfach so reinbauen kann :D Danke für die Erklärung :)
 
Ah, dachte immer, dass man HTML-Code einfach so reinbauen kann :D Danke für die Erklärung :)
Dafür müsste der PHP-Interpreter den kompletten Code Zeile für Zeile analysieren, um zu wissen, was PHP und was HTML ist. Das würde das ganze unerträglich langsam werden lassen. Durch die gekennzeichneten Blöcke aber sucht der Interpreter erst alle PHP-Blöcke einer Datei und führt ihn aus. Alles, was nicht in einem PHP-Block steht, wird ohne Umwege direkt an den Browser zurückgeliefert. ;)
 
Es lag tatsächlich daran :D Danke dafür :)
Mal wieder ne Frage: Da ich eine Wehitelist habe, würde ich mir gerne eine Mail schocken, wenn sich jemand registriert. Das ist ja unter PHP nicht so schwer(mail-Funktion), allerdings ist da ja das Problem mit dem Mailserver. Wie kann ich mir solch einen Mailserver auf dem RasPi einrichten und dann darüber Mails verschicken? Kann ich da jede beliebige Software für nehmen und was ist die beste kostenlose und vor allem performanteste davon, da der RasPi ja nicht unbegrenzt Leistung hat? ^^
 
Und direkt noch ne Frage:
Von meinem PC aus klappt alles im Moment einwandfrei. Sobald ich dann aber auf mein Handy wechsel, kann ich mich nicht mehr einloggen, mit meiner Meldung, dass mein Account nicht auf der Whitelist steht. Am PC kann ich mich aber einloggen. Jemand ne Idee, warum das so ist?
Ich habe auch mal nen Kumpel von seinem Mac probieren lassen, auch er konnte sich einwandfrei registrieren und anmelden, aber auch von seinem Handy klappt das nicht :/ Beide Handys hatten Android 5.0.
 
Und direkt noch ne Frage:
Von meinem PC aus klappt alles im Moment einwandfrei. Sobald ich dann aber auf mein Handy wechsel, kann ich mich nicht mehr einloggen, mit meiner Meldung, dass mein Account nicht auf der Whitelist steht. Am PC kann ich mich aber einloggen. Jemand ne Idee, warum das so ist?
Ich habe auch mal nen Kumpel von seinem Mac probieren lassen, auch er konnte sich einwandfrei registrieren und anmelden, aber auch von seinem Handy klappt das nicht :/ Beide Handys hatten Android 5.0.
Nach welchen Kriterien selektiert die Whitelist denn?
 
Wenn sich ein User registriert, sollte ich eine Mail bekommen(Da ist mir aber noch die Frage wegen dem Mailserver ungeklärt) Wenn ich diese Mail sehe, trage ich den User per Hand in die Whitelist ein. Diese ist eine SQL-tabelle namens "whitelist" und dort gibt es nur 1 Spalte, nämlich "benutzername". Beim Einloggen frage ich dann ab, ob in dieser Tabelle/Spalte der Benutzer enthalten ist, der sich gerade versucht einzuloggen. Danach prüfe ich das Passwort und leite ihn dann in den userbereich weiter. Bin gerade nur am Handy, werde den Code dann heute Mittag ergänzen.
Aber ich verstehe nicht, warum ich mich mit den selben Daten vom PC einloggen kann und vom Handy aus nicht :/
 
Ich möchte dir hiermit empfehlen keinen der hier geposteten Codes in einer Produktivumgebung einsetzen.
Begründen möchte ich das ganze wie folgt:

1. Der Code ist anfällig für XSS Attacken da Kontextwechsel nicht korrekt behandelt werden, mit einem manipulierten Link kann daher fremder Schadcode in deine Seite eingebunden werden.
2. Der Code ist anfällig für SQL Injections da du Nutzereingaben ungefiltert in die Datenbank sendest, ein unbefugter ist hierdurch durchaus in der Lage deinen Webserver zu übernehmen.
3. Die Passwortverschlüsselung ist nicht wirklich sicher, du verwendest hierbei SHA 256 und keine konstante Laufzeit. Zu empfehlen wäre hier auf die PHP native API zurückzugreifen. Funktionen (passwort_hash() und passwort_verify())
4. Wenn du die HTML Codes für Umlaute verwenden musst, dann ist die Kodierung deiner Dokumente & Datenbanken fehlerhaft. Verwende durchgängig Koalition UTF-8 WOB (Datenbankverbindung, Dokument, Datenbank) dann bekommst du auch keine Probleme mit Umlauten mehr und musst nicht diese HTML Krücken in den Text schreiben.

Als zusätzliche Anregung:
Deine "Whitelist" als solche lässt sich eleganter lösen, ein zusätzliches Feld in der Nutzerdatenbank ist vollkommen ausreichend z.B. "status" mit den möglichen Werten 0 und 1, dabei steht 0 für deaktiviert und 1 für aktiviert. Beim Einloggen prüfst du ob der Wert von Status 1 ist, nur dann erfolgt ein Login. Bei zu vielen erfolglosen Login Versuchen kannst du damit auch gleich den Account sperren ;)

Abschließend zu deiner Frage mit der Mail.
mail() zu verwenden ist nicht wirklich empfehlenswert, da du die Header richtig einbinden musst (was schnell daneben geht) damit der Versendende "Webserver" nicht als SPAM Server auf einer Blacklist der gängigen Provider (WEB, GMX und Co.) landet. Die Verwendung von Mailerklassen ist daher empfehlenswert.
 
Zuletzt bearbeitet:
Danke für die Antwort, aber das ganze soll zum Lernen und Experimentieren dienen.
1.) Jo, kann sein. Diese Art von Attacken kannte ich noch nicht
2.) Das ist mir bewusst
3.) Das ist SHA 512, kann ich aber auch ändern.
4.) Muss ich wohl oder übel machen müssen
5.) Auf die Idee bin ich nicht gekommen :D
6.) Ich werde mich mal informieren
 
Zurück