# Problem mit meiner PHP-Homepage



## LastChaosTyp (27. April 2015)

Guten Abend PCGHler,

Ich wollte mir eine kleine Website schreiben, über die Benutzer nachher Dateien von meinem RasperryPi aus dem Browser herunterladen können. Dies soll aber erstmal nur für mich zum Testen dienen. 
Jetzt habe ich mir ein paar PHP-Seiten geschrieben:

1.) index.php    => Sind nur 2 Links fürs Registrieren und für den Login drauf

```
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Startseite - LastChaosTyp</title>
        <meta charset='UTF-8' />
    </head>
    <body> 
        <?php 
            echo '<h2>Herzlich Willkommen auf meiner Homepage :)</h2>';
            echo '<a href="register.php">Registrieren</a>';
            echo '<p style="text-indent: 5em;"></p>';
            echo '<a href="login.php">Login</a>';
        ?>
    </body>
</html>
```


2.) register.php     => Dient zur Registrierung eines Benutzers

```
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Registrierung - LastChaosTyp</title>
        <meta charset='UTF-8' />
    </head>
    <body> 
        <h2>Registrierung</h2>
        <a href="index.php">Startseite</a>
        <form action="auswertung.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>Passwort wiederholen:*</td><td><input type="text" name="passwordRep" size="45"></td></tr><br>
            <tr><td>Anrede*: </td><td><select name="anrede">
            <option>Herr</option>
            <option>Frau</option></td></tr>
            </select><br>
            <tr><td>Vorname*: </td><td><input type="text" name="vorname" size="45"></td></tr><br>
            <tr><td>Nachname*: </td><td><input type="text" name="nachname" size="45"></td></tr><br>
            <tr><td>Geburtsdatum: </td><td><input type="text" name="datum" size="45"></td></tr><br>
            <tr><td>E-Mail*: </td><td><input type="text" name="mail" size="45"></td></tr><br>
            <tr><td>Bemerkungen: </td><td><textarea name="bemerkungen" rows="6" cols="45"></textarea></td></tr>
            <tr><td> </td><td><input type="submit" value="Weiter"><input type="reset" value="Reset" name="reset"/></td></tr>
        </table>
        </form>
    </body>
</html>
```


3.) auswertung.php      => Ist die PHP-Datei für die Registrierung, die die Daten verarbeitet und in die MySQL Tabelle einträgt/eintragen sollte

```
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Registrierung - LastChaosTyp</title>
        <meta charset='UTF-8' />
    </head>
    <body>   
        <h2>Regestrierung abschließen</h2>
        <?php
            
            $verbindung = mysql_connect("192.168.2.106", "root" , "PASSWORT HABE ICH HIER MAL RAUSGENOMMEN ;)") 
            or die("Verbindung zur Datenbank konnte nicht hergestellt werden!"); 
            mysql_select_db("user") or die ("Datenbank konnte nicht ausgewählt werden!");
            
            
            $username = addslashes(hmtlspecialchars(.$_POST['username']));
            $password = addslashes(hmtlspecialchars(.$_POST['password']));
            $passwordRep = addslashes(hmtlspecialchars(.$_POST['passwordRep']));
            $anrede = addslashes(hmtlspecialchars(.$_POST['anrede']));
            $vorname = addslashes(hmtlspecialchars(.$_POST['vorname']));
            $nachname = addslashes(hmtlspecialchars(.$_POST['nachname']));
            $datum = addslashes(hmtlspecialchars(.$_POST['datum']));
            $mail = addslashes(hmtlspecialchars(.$_POST['mail']));
            $bemerkungen = addslashes(hmtlspecialchars(.$_POST['bemerkungen']));
            
            $passwordHash = md5($password);
            
            if((vorname == "") OR (nachname == "") OR (mail == "") OR (password == "") OR (password != passwordRep) OR (username == "")) { 
                echo '<h2>Es ist ein Fehler aufgetreten! Bitte registrieren sie sich erneut. <a href=\"register.php\">Zurück</a></h2>';
                exit;
            } else {
                $result = mysql_query("SELECT id FROM benutzer WHERE username LIKE '$username'"); 
                $menge = mysql_num_rows($result); 
                if($menge == 0) 
                    { 
                    $eintrag = "INSERT INTO benutzer (username, passwort, anrede, vorname, nachname, geburtsdatum, mail, bemerkungen) VALUES ('$username', '$passwordHash', '$anrede', '$vorname', '$nachname', '$datum', '$mail', '$bemerkungen')"; 
                    $eintragen = mysql_query($eintrag);
                    if($eintragen == true) {
                        echo '<u> Ihre Benutzerdaten: </u> <br><br>';
                        echo 'Benutzername: ' .$_POST['username'] .'<br>';
                        echo 'Passwort: ' .$_POST['password'] .'<br>';
                        echo 'Name: ' .$_POST['anrede'] .' ' .$_POST['vorname'] .' ' .$_POST['nachname'] .'<br>';
                        echo 'Geburtsdatum: ' .$_POST['datum'] .'<br>';
                        echo 'E-Mail: ' .$_POST['mail'] .'<br>';
                        echo 'Bemerkungen: ' .$_POST['bemerkungen'];
                    } else {
                        echo '<h2>Es ist ein Fehler aufgetreten! Bitte registrieren sie sich erneut. <a href=\"register.php\">Zurück</a></h2>';
                    }
                } else { 
                        echo 'Dieser Benutzername ist bereits vorhanden! <a href=\"register.php\">Zurück</a>'; 
                }                          
            }
        ?>        
    </body>
</html>
```


Soweit bin ich im Moment, Login hab ich noch nicht angefangen, da die Registrierung erstmal klappen sollte  Mein Problem ist jetzt, dass ich auf auswertung.php nichts angezeigt bekomme :/ Weder die <h2> Überschrift noch sonst irgendwas. Wo ist der Fehler? Ebenfalls werden keine Daten in der MySQL Tabelle eingetragen!

Wenn ihr die Seite mal selber ausprobieren wollt:
www.lastchaostyp.noip.me


Vielen Dank und schönen Abend noch
Henri


----------



## Saguya (27. April 2015)

Mal in die *error logs* vom webserver geschaut? ich schätze mal du benutzt apache2?


----------



## LastChaosTyp (28. April 2015)

Jo, ich benutze Apache2, aber wo liegen denn die Logs? Bin neu in Linux


----------



## bingo88 (28. April 2015)

In Regel unter /var/log/apache2 oder /var/log/httpd.


----------



## Penman (28. April 2015)

Während du entwickelst, lohnt es sich in der php.ini zwei Variablen zu ändern, die du für ein Produktivsystem aber wieder abschalten solltest.

Editiere mal als root die /etc/php/cgi/php.ini die Werte von error_reporting und display_errors zu :

```
error_reporting = E_ALL
[...]
display_errors = On
```

Dann spuckt er dir eine ganze Menge Kram raus und bemängelt unsauberen Code (Notices sind an sich nichts schlimmes, aber ich nutze sie gerne, weil man damit sauberen Code schreibt). Wenn's dich stört, benutz anstatt E_ALL einfach E_ALL & ~E_NOTICE.

Es ist übrigens nicht gerade die beste Idee, sämtlichen Input erst einmal mit irgendwelchen Filtern zu bearbeiten. 

```
$username = addslashes(hmtlspecialchars(.$_POST['username']));
```
Ich sehe, was du versuchst zu machen, aber aber das macht noch keinen Sinn an der Stelle, weil die beiden Funktionen eher auf die Ausgabe ausgerichtet sind. Du möchtest schließlich erst mit den rohen Eingabedaten arbeiten und nicht irgendwelche Sonderzeichen in der Datenbank stehen haben.
Wenn du Dinge in die Datenbank schreiben möchtest, escape sie mit mysql_real_escape_string($str). Für die Ausgabe kannst du das dann so machen.

Übrigens versteckt sich in den Zeilen auch gleich der Fehler:
h*mt*lspecialchars <- Es muss htmlspecialchars heißen.


----------



## boss3D (28. April 2015)

LastChaosTyp schrieb:


> Wo ist der Fehler? Ebenfalls werden keine Daten in der MySQL Tabelle eingetragen!


Auf den ersten Blick kommt mir das hier komisch vor:

```
$verbindung = mysql_connect("192.168.2.106", "root" , "PASSWORT HABE ICH HIER MAL RAUSGENOMMEN ;)") 
            or die("Verbindung zur Datenbank konnte nicht hergestellt werden!"); 
mysql_select_db("user") or die ("Datenbank konnte nicht ausgewählt werden!");
```
Wenn ich mich nicht täusche, müsstest Du der Funktion mysql_select_db() (siehe "Beispiele") neben der DB auch noch die Verbindung als Parameter geben. 

```
mysql_select_db("user", $verbindung)
```
Würdest Du mysqli benutzen, könntest Du das alternativ auch in einer Zeile lösen:
	
	



```
$db = mysqli_connect("192.168.2.106", "root", "<Passwort>", "user");
```


----------



## LastChaosTyp (28. April 2015)

Bin noch in der Schule im Moment, werde das dann nachher mal alles durchgehen  Danke schonmal für die Hilfe. Aber warum bekomme ich bei der Auswertung.php Gar nichts angezeigt? Mir sollte doch wenigstens die erste <h2> Überschrift angezeigt werden, oder etwa nicht?


----------



## boss3D (28. April 2015)

Ich habe jetzt einfach mal Deinen ganzen auswerten.php Code in ein File mit eben diesem Namen gesteckt, das in meiner xampp Installation in den htdocs Ordner eingefügt und im Browser mit _127.0.0.1/auswerten.php_ aufgerufen. Dabei habe ich erstmal nur einen Syntax-Error in Zeile 16 angezeigt bekommen. Das ist genau da, wo bei Dir das ganze addslashes-Zeug anfängt. Also habe ich dann diesen Block (Zeile 16 bis 24) auskommentiert und danach folgendes angezeigt bekommen:



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



^^ Das dürfte jetzt der Fehler sein, auf den ich in meinem vorigen Posting hingewiesen habe. Wie Du siehst, wird damit allerdings zumindest Deine Überschrift angezeigt ...

Also korrigiere mal bitte Deine Verbindung zur DB und überlege Dir was schlaueres anstatt dem addslashes-Zeugs. Wenn's dann noch nicht geht, kann man weiterschauen.

[EDIT]
Der Syntaxfehler ist wohl das von Penman entdeckte "hmtl...". Dennoch: Lass das addslashes() erstmal.


----------



## LastChaosTyp (28. April 2015)

Jo, mach ich nachher mal


----------



## Penman (28. April 2015)

boss3D schrieb:


> Auf den ersten Blick kommt mir das hier komisch vor:
> 
> ```
> $verbindung = mysql_connect("192.168.2.106", "root" , "PASSWORT HABE ICH HIER MAL RAUSGENOMMEN ;)")
> ...


Das Übergeben einer Verbindungskennung ist nicht nötig, da nur eine Verbindung geöffnet ist.


> Wird die Verbindungskennung nicht angegeben, wird die letzte durch mysql_connect() geöffnete Verbindung angenommen.


Man sollte sich eventuell wirklich mal den netten Warnhinweis auf der Manual-Seite geben und gleich auf MySQLi oder PDO Basis programmieren. Nicht, dass die Entwickler noch auf die Idee kommen, bald die MySQL-Funktionen zu entfernen.

Warum du nur eine weiße Seite bekommst, könnte daran liegen, dass PHP die Auslieferung abbricht, wenn es auf einen Fehler läuft, was es unweigerlich tut. Das könnte den gebufferten Inhalt betreffen. Da bin ich mir gerade nicht sicher.
Wichtig ist jedenfalls, dass du die Fehler beseitigst und dir die Fehler entweder direkt im Browser anzeigen lässt oder du den Errorlog verfolgst. (tail -f /var/log/apache2/error.log)


----------



## boss3D (28. April 2015)

^^ Ich hatte meine auf die Schnelle erstellte Test-DB nicht "user" genannt, deswegen bei mir keine DB-Verbindung ... XD
Der Parameter ist wohl wirklich optional.
-----------

Statt dem addslashes(), wie bereits von Penman erwähnt, besser (in allen 9 Zeilen):

```
$username = mysql_real_escape_string($_POST['username']);
```
Hier die $-Zeichen als Variablenkennzeichnung nicht vergessen:

```
if(($vorname == "") OR ($nachname == "") OR ($mail == "") OR ($password == "") OR ($password != $passwordRep) OR ($username == "")) {
```
Und Deine Überprüfung auf Vorhandensein habe ich so umbasteln müssen:

```
$check = mysql_query("SELECT * FROM benutzer WHERE username='".$vorname."';");
if (!mysql_num_rows($check))
```
Damit funktioniert's bei mir ...




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Wenn Du allerdings eine id in Deiner DB hast, könnte es auch damit funktionieren (statt meiner Variante mit Sternchen für alle Felder).


----------



## Penman (28. April 2015)

boss3D schrieb:


> ```
> $username = mysql_real_escape_string($_POST['username']);
> ```


Nicht den Input direkt escapen! Das sorgt für verwunderswerte Dinge, wenn z.B. ein User "Bar's Foo" heißt, dann wird er innerhalb des Systems "Bar\'s Foo". Das ist ein Zeichen mehr und das mittendrin. Das ist unschön. Bei Passwörtern ist es noch schöner: Ein anderes System würde nicht auf denselben Passworthash kommen, da das Escapen ein Zeichen eingefügt hat, das eigentlich nicht da sein sollte. mysql_real_escape_string deshalb nur verwenden, wenn etwas in einen SQL-Query eingesetzt werden soll.



boss3D schrieb:


> Hier die $-Zeichen als Variablenkennzeichnung nicht vergessen:
> 
> ```
> if(($vorname == "") OR ($nachname == "") OR ($mail == "") OR ($password == "") OR ($password != $passwordRep) OR ($username == "")) {
> ```


Eine einfache, nicht sonderliche schöne Art. Mehr als True oder False kann sie nicht zurückgeben. Das freut jeden User, wenn er liest "Ein Fehler ist aufgetreten". 
Fehler direkt in ein Array speichern, ein Fehlercode o.Ä. würde solchen Frust vermeiden. Für den Anfang aber "erlaubt" (genauso == ""  )



boss3D schrieb:


> Und Deine Überprüfung auf Vorhandensein habe ich so umbasteln müssen:
> 
> ```
> $check = mysql_query("SELECT * FROM benutzer WHERE username='".$username."';");
> ...


Richtig. Anstatt den MySQL-Server alle Felder (*) übertragen zu lassen einfach den Primary Key oder eine nützliche Information anfragen. "WHERE x LIKE y" verwendet man nicht bei exakten Gleichheitsprüfungen. Sofern du also nicht vorhast mit Jokerzeichen zu arbeiten, solltest du "WHERE x = y" verwenden, weil der MySQL-Server dann den Index benutzen kann.


----------



## boss3D (28. April 2015)

Penman schrieb:


> Eine einfache, nicht sonderliche schöne Art. Mehr als True oder False kann sie nicht zurückgeben. Das freut jeden User, wenn er liest "Ein Fehler ist aufgetreten".
> Fehler direkt in ein Array speichern, ein Fehlercode o.Ä. würde solchen Frust vermeiden. Für den Anfang aber "erlaubt" (genauso == ""  )


Die Zeile war nicht als meine Idee oder gar Empfehlung gedacht. Ich würde noch viel eher  folgendes machen (und die Variablenzuweisung in einem else statt dem Block oben in seinem Code):
	
	



```
if (!isset($_POST['username'] or ...)
```
Bei der Variante des TEs weist er sofort alles zu und überprüft erst danach, ob ihm die Daten überhaupt passen und er sie verwerten will.

Aber ich wollte erst einmal abwarten, ob der TE sein Projekt mit kleinen Änderungen am bestehenden Code zum Laufen kriegt. Eine sinnvolle Fehlermeldung müsste man jedenfalls auch bei dieser Variante hier ergänzen.

[EDIT @ TE]
MD5 ist anno 2015 so "gut" als wenn Du gar keinen Schutz verwenden würdest. Mach lieber:

```
$salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
$passwordHash = hash('sha512', ($_POST['password']).$salt);
```


----------



## LastChaosTyp (28. April 2015)

Habe den Code mal überarbeitet, jetzt bekomm ich auch was angezeigt, aber immernoch nicht mein Ergebnis :/ 
Ich habe das mit den Fehlermeldungen noch nicht ganz verstanden: Wie mache ich die an? Muss ich die ";" in der Config vor den entsprechenden Zeilen entfernen? Kenn mich mit Linux, wie bereits gesagt, kaum aus 
So sieht die /etc/php5/cli/php.ini jetzt aus:



			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Und das ist mein überarbeiteter Code:

```
<?php echo '<!DOCTYPE html>'; ?>
<html>
    <head>
        <title>Registrierung - LastChaosTyp</title>
        <meta charset='UTF-8' />
    </head>
    <body>   
        <h2>Regestrierung abschließen</h2>
        <?php
            $tabelle = mysqli_connect("192.168.2.106", "root", "MEIN PASSWORT", "user");
            
            $username = $_POST['username'];
            $password = $_POST['password'];
            $passwordRep = $_POST['passwordRep'];
            $anrede = $_POST['anrede'];
            $vorname = $_POST['vorname'];
            $nachname = $_POST['nachname'];
            $datum = $_POST['datum'];
            $mail = $_POST['mail'];
            $bemerkungen = $_POST['bemerkungen'];
            
            $passwordHash = md5($password);
            
            $usernameDB = mysql_real_escape_string($username);
            $anredeDB = mysql_real_escape_string($anrede);
            $vornameDB = mysql_real_escape_string($vorname);
            $nachnameDB = mysql_real_escape_string($nachname);
            $datumDB = mysql_real_escape_string($datum);
            $mailDB = mysql_real_escape_string($mail);
            $bemerkungenDB = mysql_real_escape_string($bemerkungen);
 
            if(($vorname == "") OR ($nachname == "") OR ($mail == "") OR ($password == "") OR ($password != $passwordRep) OR ($username == "") OR ($username != $usernameDB)) { 
                echo '<h2>Ihre Eingaben sind nicht korrekt! Bitte registrieren sie sich erneut. <a href=\"register.php\">Zurück</a></h2>';
                exit;
            } else {
                $result = mysql_query("SELECT id FROM benutzer WHERE username LIKE '$username'"); 
                $menge = mysql_num_rows($result); 
                if($menge == 0) 
                    {                               
                    $eintrag = "INSERT INTO benutzer (username, passwort, anrede, vorname, nachname, geburtsdatum, mail, bemerkungen) VALUES ('$usernameDB', '$passwordHash', '$anredeDB', '$vornameDB', '$nachnameDB', '$datumDB', '$mailDB', '$bemerkungenDB')"; 
                    $eintragen = mysql_query($eintrag);
                    if($eintragen == true) {
                        echo '<u> Ihre Benutzerdaten: </u> <br><br>';
                        echo 'Benutzername: ' .$_POST['username'] .'<br>';
                        echo 'Passwort: ' .$_POST['password'] .'<br>';
                        echo 'Name: ' .$_POST['anrede'] .' ' .$_POST['vorname'] .' ' .$_POST['nachname'] .'<br>';
                        echo 'Geburtsdatum: ' .$_POST['datum'] .'<br>';
                        echo 'E-Mail: ' .$_POST['mail'] .'<br>';
                        echo 'Bemerkungen: ' .$_POST['bemerkungen'];
                    } else {
                        echo '<h2>Es ist ein Fehler aufgetreten! Bitte registrieren sie sich erneut. <a href=\"register.php\">Zurück</a></h2>';
                    }
                } else { 
                        echo 'Dieser Benutzername ist bereits vorhanden! <a href=\"register.php\">Zurück</a>'; 
                }                          
            }
        ?>        
    </body>
</html>
```

Ich wieß jetzt auch noch nicht, wie ich das genau mit dem Passwort machen soll. Aber eine SQL-Injektion sollte doch durch den md5-Hash verhindert werden, oder? Dann muss ich das doch nicht vorher per mysql_real_escape_string() umwandeln, oder?

Danke nochmal für die Hilfe


----------



## boss3D (28. April 2015)

Also ich, für meinen Teil, hätte mir das eher so in die Richtung vorgestellt:


Spoiler





```
<!DOCTYPE html>
<html>
    <head>
        <title>Registrierung - LastChaosTyp</title>
    </head>
    <body>   
        <h2>Registrierung abschließen</h2>
        <?php     
            error_reporting(E_ALL);
            
            define('MYSQL_HOST', '127.0.0.1');
            define('MYSQL_USER', 'root');
            define('MYSQL_PASS', '');
            define('DATABASE', 'user');
            
            $salt = "#sf$!\"ä\"\$asd³s²a~§653 sa51d75qÖAa@üeX";
            
            $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;
            }
            
            if (isset($_POST['vorname'], $_POST['nachname'], $_POST['mail'], $_POST['password'], $_POST['passwordRep'], $_POST['username']) and trim($_POST['vorname']) != "" and trim($_POST['nachname']) != "" and trim($_POST['mail']) != "" and trim($_POST['password']) != "" and trim($_POST['passwordRep']) != "" and trim($_POST['username']) != "") {  
                $username = ($_POST['username']);        
                $password = ($_POST['password']);
                $passwordRep = ($_POST['passwordRep']);
                $anrede = ($_POST['anrede']);
                $vorname = ($_POST['vorname']);
                $nachname = ($_POST['nachname']);
                $datum = ($_POST['datum']);
                $mail = ($_POST['mail']);
                $bemerkungen = ($_POST['bemerkungen']);
                if ($password != $passwordRep) {
                    echo '<h2>Die Bestätigung des Passworts stimmt nicht.<a href="register.php">Zurück</a></h2>';
                } else {
                    $passwordHash = hash('sha512', ($password).$salt);
                    $check = mysqli_query($db, "SELECT username FROM user WHERE username='".$username."';");
                    if (mysqli_num_rows($check))  {
                        echo '<h2>Benutzername schon vorhanden.<a href="register.php">Zurück</a></h2>';
                    } else {
                        $entry = mysqli_query($db, "INSERT INTO user (username, password, anrede, vorname, nachname, datum, mail, bemerkung) VALUES ('$username', '$passwordHash', '$anrede', '$vorname', '$nachname', '$datum', '$mail', '$bemerkungen')");
                        if ($entry) {
                            echo '<u> Ihre Benutzerdaten: </u> <br><br>';
                            echo 'Benutzername: ' .$_POST['username'] .'<br>';
                            echo 'Passwort: ' .$_POST['password'] .'<br>';
                            echo 'Name: ' .$_POST['anrede'] .' ' .$_POST['vorname'] .' ' .$_POST['nachname'] .'<br>';
                            echo 'Geburtsdatum: ' .$_POST['datum'] .'<br>';
                            echo 'E-Mail: ' .$_POST['mail'] .'<br>';
                            echo 'Bemerkungen: ' .$_POST['bemerkungen'];
                        } else {
                            echo '<h2>Es ist ein Fehler aufgetreten! Bitte registrieren Sie sich erneut. <a href="register.php">Zurück</a></h2>';
                        }
                    }  
                }
            } else {    
                echo '<h2>Eingabefehler. Bitte alle Felder korrekt ausfüllen.<a href="register.php">Zurück</a></h2>';
            }
        ?>        
    </body>
</html>
```



Ich habe dieses mysql_real_escape_string selbst noch nie benutzt, deswegen kann ich Dir dazu nichts sagen. Aber einen Tipp will ich Dir trotzdem geben: Verwende niemals Funktionen, die Du nicht kennst und bei denen Du nicht zu 100 % verstehst, was die genau machen!!! Ansonsten wirst Du früher oder später Fehler kriegen, deren Ursache Du suchen kannst bist Du alt wirst! 

Überhaupt sollte Dein Ziel erst einmal sein, einen möglichst einfachen Code, der mal nur die Grundfunktionalität Deines Programmes liefert, fehlerfrei zum Laufen zu kriegen.

Jedenfalls, wenn Du meinen Code, der bei mir einwandfrei funktioniert, ausprobieren willst und der bei Dir aber nicht geht, dann liegt's daran, dass unsere DBs nicht völlig idente Bezeichnungen haben und auch unsere Testumgebungen (IP-Adressen, ...) unterschiedlich sind. Auf gut Deutsch: Du müsstest die Bezeichnungen an Dein Setting anpassen. Eben die IP und das PW in der Verbindung, und event. ein paar Namen, aber das darfst Du selbst checken. 

Mit error_reporting war, denke ich, E_ALL in der entsprechenden Funktion gemeint. Das solltest Du dann im "Produktivbetrieb" Deiner Website auf 0 setzen um potenziellen Angreifern keine Fehler und Schwachstellen im Code zu verraten.


----------



## LastChaosTyp (28. April 2015)

Ah, vielen Dank. Den Code verstehe ich soweit, muss mir halt nochmal die Methoden genau anschauen. Ich hielt meinen Code auch ziemlich einfach, zB. mit $username != "" und so weiter, aber das habt ihr ja ausgebessert 

Noch ne Frage: Wo kann ich diese Codes für zB. "ß" finden, also "ß"? Was ist das denn für eine Kodierung?


Edit: Habe grade mal meine Website dementsprechend erneuert. Nun habe ich die genaue Fehlermeldung, die mir vorher gefehlt hat: 
"Verbindung zur Datenbank konnte nicht hergestellt werden: (2003) Can't connect to MySQL server on '192.168.2.106' (111)"

Woran könnte das liegen? Ich weiß selber, dass so ein Fehler ziemlich viele Ursachen haben kann, aber vielleicht habt ihr ja ein paar Tipps, wo der Fehler liegen könnte. Ich kann von meinem Windows-Rechner wunderbar auf PHPMyAdmin von meinem RasPi zugreifen, also auch auf die Datenbank(en). Port wurde im Router an meinen RasPi weitergeleitet.


----------



## boss3D (28. April 2015)

Zeichenreferenz

Bzgl. des Error: Du bist doch unter Linux unterwegs?! Probiere mal ...

```
nano /etc/mysql/my.cnf
#bind-address = 127.0.0.1
service mysql restart
```
Zeile 2 ist kein command! Du sollst die Zeile im config file durch die Raute auskommentieren. Quelle

^^ Wenn's das nicht ist, weitergoogeln. Ich habe das hier unter Win7 mit xampp laufen. K. A. was man unter Linux alles einstellen muss.


----------



## LastChaosTyp (29. April 2015)

Ich bin ein Vollidiot: Ich schreibe die PHP Seiten auf Windows und kopiere sie dann rüber auf meinen RasPi. Natürlich müsste ich von meinem Windowsrechner die lokale IP des Pi eintragen, aber wenn ich die Seite rüberkopiere, dann muss ich ja localhost/127.0.0.1 nehmen  Werde ich nachher mal prüfen, ob das der Fehler war, muss jetzt zur Schule


----------



## LastChaosTyp (29. April 2015)

Kleines Update:
Ich bin wirklich ein Vollidiot  Ich habe in der DB andere Spaltennamen als in meinem Code verwendet :facepalm: Danke für die Hilfe!




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Aber noch was, was mir grade so aufgefallen ist: Wenn ich meinen SQL-Service neustarte, kommt da auch eine Fehlermeldung. Was hat die zu bedeuten? Ich habe die dazugehörige Config-Datei mal links daneben aufgemacht. Stimmt das so oder muss da auch 127.0.0.1 hin?


----------



## boss3D (29. April 2015)

^^ Im untersten Drittel des Codes haben wir ein if ($entry), dessen Code im Block nur ausgeführt wird, wenn $entry "wahr" ist. Und das ist nur dann der Fall, wenn das INSERT-query darüber korrekt ausgeführt wurde. Andernfalls landet er im else Block, wo eben die Fehlermeldung auf deinem Screenshot ausgegeben wird ...

Ich nehme an, bei Dir werden keine Daten in die DB geschrieben?! Überprüfe das bitte mal. Bei mir hat's allerdings tadellos geklappt. Ich vermute daher, dass immer noch ein paar wenige Bezeichnungen im Code nicht mit Deiner DB übereinstimmen.

Deine DB heißt definitiv 'user', der meiste Rest müsste auch passen. Vielleicht heißt Deine PW-Spalte in der DB 'passwort' und nicht 'password'? Oder hast Du 'bemerkungen' statt 'bemerkung'?


----------



## LastChaosTyp (29. April 2015)

Richtig, ich habe das im letzten Post editiert, da hast du anscheinend an der Antwort geschrieben  Ja, "password" hieß in der DB zB. "passwort". Das kam mehr mals vor  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)


----------



## boss3D (29. April 2015)

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. 
	
	



```
[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 ...


----------



## LastChaosTyp (10. Mai 2015)

Hi, 
habe eine neue Frage, da ich jetzt weiter an der Hp arbeiten wollte  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?


```
$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?


----------



## Ap0ll0XT (10. Mai 2015)

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.


----------



## LastChaosTyp (10. Mai 2015)

Okay, so habe ich mir das schon gedacht  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

```
<?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

```
<?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 
	
	



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


----------



## Ap0ll0XT (10. Mai 2015)

Soweit ich mich erinnere, bekommst du bei einem Query nur eine Resultat-Referenz zurück. Du müsstest das Ergebnis noch fetchen.


----------



## LastChaosTyp (10. Mai 2015)

Danke für den Hinweis, hatte ich in der "Eile" vergessen  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...


----------



## Ap0ll0XT (10. Mai 2015)

Naja Filemanagement auf dem Server ist kein Hexenwerk. Das sollte kein Thema sein


----------



## LastChaosTyp (10. Mai 2015)

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  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  Bisher sieht das ganze so aus:

loginAuswertung.php

```
<?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)

```
<?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 , ratlos. Ich kopier hier grad noch mal die Orginal-Index-Seite hin, die ich integrieren will:

index.html

```
<!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>
```


----------



## Ap0ll0XT (10. Mai 2015)

Du hast ein

```
?>
```
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.


----------



## LastChaosTyp (11. Mai 2015)

Welches   ?> Meinst du denn?


----------



## Ap0ll0XT (11. Mai 2015)

LastChaosTyp schrieb:


> 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 

```
<?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


----------



## LastChaosTyp (11. Mai 2015)

Ah, dachte immer, dass man HTML-Code einfach so reinbauen kann  Danke für die Erklärung


----------



## Ap0ll0XT (11. Mai 2015)

LastChaosTyp schrieb:


> Ah, dachte immer, dass man HTML-Code einfach so reinbauen kann  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.


----------



## LastChaosTyp (11. Mai 2015)

Es lag tatsächlich daran  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? ^^


----------



## LastChaosTyp (12. Mai 2015)

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.


----------



## Ap0ll0XT (12. Mai 2015)

LastChaosTyp schrieb:


> 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?


----------



## LastChaosTyp (13. Mai 2015)

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 :/


----------



## TessaKavanagh (13. Mai 2015)

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.


----------



## LastChaosTyp (13. Mai 2015)

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 
6.) Ich werde mich mal informieren


----------



## TessaKavanagh (13. Mai 2015)

Also wenn du lernen möchtest dann empfehle ich dir persönlich folgendes
zu 1) zum Stichwort "Kontextwechsel" schlau machen
zu 2) zum Stichwort "prepared Statements" schlau machen (Ob du dabei lieber mysqli oder PDO verwenden möchtest ist Geschmackssache)
zu 3) wirklich sichere Hashs zu erstellen ist kompliziert, die angegebene "Unsicherheit" bezog sich weniger auf den verwendeten Algorythmus sondern primär auf die Verwendung eines statischen Salts und die Möglichkeit vom Timing Attacken. Das Passwort: 123456 wird bei deinem Code zwangsläufig immer zum gleichen Hash führen. Wenn jetzt also zwei Benutzer das gleiche Passwort wählen steht in deiner Datenbank auch zweimal ein gleicher Hash. Das ist normalerweise so nicht gewünscht und lässt sich leicht vermeiden.
zu 4) du brauchst allerdings auch einen Texteditor der die Datei entsprechend speichern kann. Notepad++ wäre z.B. ein Kandidat.
zu 5) Zum lernen würde ich dir auch nahelegen  dich früher oder später mit dem Thema normalisieren von Datenbanken zu beschäftigen. Machst du das nicht wird es dir später schwerer Fallen Software zu warten oder Dinge zu ändern.

Ansonsten viel Erfolg und Spaß beim lernen und verbessern der eigenen Fertigkeiten.


----------



## LastChaosTyp (13. Mai 2015)

3.) Wie wird so Etwas denn in der Realität gemacht? Wird dann für jeden Benutzer ein eigener Salt errechnet und der dann auch wieder in einer Spalte in der Datenbank gespeichert?
4.) Natürlich benutze ich Notepad++
5.) Wenn ich die Software selber schreibe und verwalte, fällt mir das persönlich ziemlich leicht, da ich mir gut merken kann, wie ich etwas umgesetzt habe. Für andere ist das dann manchmal deutlich schwerer


----------



## TessaKavanagh (13. Mai 2015)

zu 5) Das ist ein Irrtum das kannst du mir glauben . ich habe früher nicht anders gedacht aber wenn der Code komplexer wird oder du Ihn mal ein halbes Jahr bei Seite gelegt hast und dann etwas ändern musst wirst du dich an meine Worte erinnern . Aber manchmal muss mein seine eigenen Fehler machen um es zu Lernen  probiere es also ruhig so aus wie du meinst  
zu 3) Jain im Prinzip schon, der Salt wird dann auch in der Nutzertabelle gespeichert bei der Funktion passwort_hash() wird er allerdings zusammen mit dem eigentlichem Hash und dem Code für den verwendeten Algorythmus und den zu verwendenden Berechnungsaufwand (im Prinzip Wiederholung der Durchläufe) in einem bestimmten Format in ein gemeinsames Tabellenfeld gespeichert.


----------



## LastChaosTyp (13. Mai 2015)

Wegen 5.) Ich habe vor ca. 2 Jahren ein Plugin geschrieben, welches ca. 10.000 Zeilen hat. Ich habe mal reingeschaut und ich verstehe immernoch 90% des Codes auf Anhieb


----------

