Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » PHP Login Script mit Prepared-Statements, MySQLi und HTML5    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
     PHP Login Script mit Prepared-Statements, MySQLi und HTML5 Zitat | Bearbeiten

In diesem Tutorial zeige ich euch, wie ihr einen modernen Login erstellt, auf Basis von Sessions, HTML5 und Prepared-Statements für gute Sicherheit. Ich übernehme allerdings keine Haftung für Schäden, Fehlfunktionen oder dergleichen!

Was wird benötigt?
- PHP 5.2.x fähiger Web-Server (getestet mit PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6)
- MySQLi 5.1 Datenbank (getestet mit MySQL 5.5 und MySQL 5.6)


Schritt 1/4 - Datenbank einrichten
Führe bitte folgenden SQL-Befehl in einer bereits existierenden Datenbank aus, um eine neue Tabelle namens user anzulegen.

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
CREATE TABLE `user` (
`user_id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_name` VARCHAR( 100 ) NOT NULL ,
`user_email` VARCHAR( 255 ) NOT NULL ,
`user_password` VARCHAR( 32 ) NOT NULL ,
UNIQUE (`user_email`)
);


INSERT INTO `user` (
`user_id` ,
`user_name` ,
`user_email` ,
`user_password`
)VALUES(
NULL , 'Max Mustermann', 'max@mustermann.de', '098f6bcd4621d373cade4e832627b4f6'
);


Nun habt ihr eine neue Tabelle die den Namen user trägt. Ein Beispieldatensatz ist ebenfalls schon eingetragen, der beliebig geändert werden kann. Das Kennwort wäre test.

Schritt 2/4 - Die config.php
In der config.php tragen wir nun die Zugangsdaten zur Datenbank ein. In dieser Datei regeln wir die Datenbank-Verbindung und die Fehlerbehandlung, falls welche auftreten sollten. Die Datei sieht wie folgt aus:

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
<?php
/*
 *    Autor        : Dennis1993
 *    Copyright    : (c) 2011 by Dennis1993
 */
defined('SECURE') or die('Der direkte Zugriff auf diese Datei ist nicht erlaubt!');


/**
 *    DB-Zugangsdaten
 */
$config['sql_hostname'] = 'localhost';    //MySQL-Server
$config['sql_username'] = 'root';        //Benutzername
$config['sql_password'] = 'hallo';        //Kennwort
$config['sql_database'] = 'login';        //Datenbank


/**
 *    Fehlerbehandlung
 */
error_reporting(E_ALL);
ini_set('display_errors'false);


/**
 *    Verbindungsaufbau
 */
$SQL = new MySQLi($config['sql_hostname'], $config['sql_username'], $config['sql_password'], $config['sql_database']);

if(
mysqli_connect_errno() != || !$SQL->set_charset('utf8'))
{
    die(
'<strong>ERROR:</strong> Es konnte keine Verbindung mit dem Datenbank-Server hergestellt werden!');
}

?>



Schritt 3/4 - Die login.php
In dieser Datei befindet sich die Logik des Systems, dass heißt, hierüber steuert das Script, ob der Benutzer die richtigen Daten angegeben hat und prüft diese in der Datenbank ab. Ist alles ok, setzt das Script eine Session und leitet den Benutzer auf die intern.php weiter. Außerdem wird hier auch der Logout geregelt, den man erst nach dem erfolgreichen Login durchführen kann.

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
<?php
/*
 *    Autor        : Dennis1993
 *    Copyright    : (c) 2011 by Dennis1993
 */
session_start();
define('SECURE'true);
require_once(
'config.php');


/**
 *    Abmeldevorgang
 */
if(isset($_GET['logout']))
{
    if(isset(
$_SESSION['user_id']))
    {
        
$_SESSION = array();
        
session_destroy();
    }

    
header('location: login.php');
    exit();
}


/**
 *    Anmeldevorgang
 */
if(isset($_POST['send']))
{
    
$user_email trim(htmlspecialchars($_POST['user_email']));
    
$user_password trim(htmlspecialchars($_POST['user_password']));

    
//Benutzereingaben validieren
    
if(filter_var($user_emailFILTER_VALIDATE_EMAIL) && !empty($user_password))
    {
        
$query $SQL->prepare('SELECT `user_id` FROM `user` WHERE `user_email` = ? AND `user_password` = ?');
        
$query->bind_param('ss'$_POST['user_email'], md5($_POST['user_password']));
        
$query->execute();
        
$query->store_result();
        
$query->bind_result($user_id);

        
//Sind Benutzerdaten vorhanden und korrekt?
        
if($query->num_rows == 1)
        {
            
$query->fetch();
            
$_SESSION['user_id'] = $user_id;
            
header('location: intern.php');
            exit();
        }
        else
        {
            
$error 'Ihre Anmeldedaten sind nicht korrekt. Bitte wiederholen Sie Ihre Eingabe.';
        }
    }
    else
    {
        
$error 'Bitte f&uuml;llen Sie alle Felder korrekt aus.';
    }
}
else
{
    
$error NULL;
    
$user_email NULL;
}

?>
<!DOCTYPE HTML>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Login</title>
</head>

<body>
<?php echo $error?>
<form action="login.php" method="post">
<table cellpadding="1" cellspacing="4">
    <tr>
        <td><strong>E-Mail-Adresse:</strong></td>
        <td><input type="email" name="user_email" value="<?php echo $user_email?>" required="required" placeholder="E-Mail-Adresse" maxlength="255" /></td>
    </tr>
    <tr>
        <td><strong>Passwort:</strong></td>
        <td><input type="password" name="user_password" required="required" placeholder="Passwort" maxlength="50" /></td>
    </tr>
    <tr>
        <td colspan="2"><input type="submit" name="send" value="Login" /></td>
    </tr>
</table>
</form>

</body>
</html>


Schritt 4/4 - Die intern.php

Diese Datei hat im Grunde kaum eine Wirkung. Sie soll nur zeigen, wie man prüfen kann, ob ein Benutzer angemeldet ist oder nicht. Ferner kann man sich hier noch abmelden. Die Datei sieht wie folgt aus:

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
<?php
/*
 *    Autor        : Dennis1993
 *    Copyright    : (c) 2011 by Dennis1993
 */
session_start();
if(!isset(
$_SESSION['user_id']))
{
    die(
'Sie sind nicht angemeldet! <a href="login.php">[Login]</a>');
}
?>
<!DOCTYPE HTML>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Login</title>
</head>

<body>
<p>Willkommen im internen Bereich! Sie k&ouml;nnen sich hier wieder abmelden. <a href="login.php?logout">[Abmelden]</a></p>
</body>
</html>



Sollte jemand einen Fehler finden, einen Verbesserungsvorschlag oder eine Frage haben, würde ich mich über einen Post freuen.

Das Script kann man nun nutzen. Die Beispieldaten lauten:
E-Mail-Adresse: max@mustermann.de
Passwort: test

Viel Spaß damit!
Dennis1993




Post wurde schon 15x editiert, das letzte mal am 21.06.2015 um 17:15 von
23.04.2011, 14:04 Profil | PM | E-Mail  
stex
Mitglied
Sehr guter User


Dabei seit: 14.04.2009
Herkunft: Hannover
Posts: 650
      Zitat | Bearbeiten

Ganz Schön

Vllt nochmal ne Variante mit MySQL basteln, da, so glaube ich zumindest, noch sehr sehr viele Leute MySQL benutzen.

Sonst top


23.04.2011, 15:20 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2496
      Zitat | Bearbeiten

Zitat:
Orginal von stex
Ganz Schön

Vllt nochmal ne Variante mit MySQL basteln, da, so glaube ich zumindest, noch sehr sehr viele Leute MySQL benutzen.

Sonst top


?? Das ist doch mit MySQL...


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
23.04.2011, 15:37 Profil | PM | E-Mail  


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
      Zitat | Bearbeiten

Zitat:
Orginal von stex
...Vllt nochmal ne Variante mit MySQL basteln, da, so glaube ich zumindest, noch sehr sehr viele Leute MySQL benutzen...

Ne, MySQLi lasse ich ruhig mal. Das kann eigentlich so gut wie jeder Server schon problemlos.

Und danke für dein Lob!!!

Zitat:
Orginal von DingsDaBums
?? Das ist doch mit MySQL...


MySQLi ist es. Hast du wahrscheinlich übersehen




Post wurde schon 1x editiert, das letzte mal am 23.04.2011 um 15:45 von
23.04.2011, 15:44 Profil | PM | E-Mail  
Maya
Mitglied
Aktiver User


Dabei seit: 26.03.2011
Herkunft: Düsseldorf
Posts: 105
      Zitat | Bearbeiten

Hi

kurze Frage (ist keine Kritik): Wieso wird Version PHP5.3 benötigt? Welche Funktionen sind den Vorgängern nicht verwendbar?


23.04.2011, 19:57 Profil | PM | E-Mail  
php-elite.de
Mitglied
Guter User


Dabei seit: 28.11.2010
Herkunft: keine Angabe
Posts: 250
      Zitat | Bearbeiten

isset();



ich sehe nichts warum es auch nicht mit PHP 5.2 etc,, laufen sollte.

Nettes Skript.




Post wurde schon 1x editiert, das letzte mal am 23.04.2011 um 20:26 von php-elite.de
23.04.2011, 20:00 Profil | PM | E-Mail  


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
      Zitat | Bearbeiten

Ist die Funktion filter_var() nicht erst ab 5.3 dabei?

Muss ich gleich nochmal schauen.

[color=red]Edit: Alles klar, Fehler meinerseits. Die Filter-Funktion gibt es doch schon seit 5.2 ( http://de2.php.net/filter_var ) Habe ich oben geändert, danke!

Empfehlen tue ich dann aber 5.3, damit es doch noch einen Zweck hat [/color]




Post wurde schon 2x editiert, das letzte mal am 23.04.2011 um 22:44 von
23.04.2011, 22:41 Profil | PM | E-Mail  
php-elite.de
Mitglied
Guter User


Dabei seit: 28.11.2010
Herkunft: keine Angabe
Posts: 250
      Zitat | Bearbeiten

nö ab 5.2

EDIT: schau mal auf der Zeit, dein Edit war noch nicht vorhanden als ich gepostet habe




Post wurde schon 2x editiert, das letzte mal am 23.04.2011 um 22:52 von php-elite.de
23.04.2011, 22:43 Profil | PM | E-Mail  


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
      Zitat | Bearbeiten

Zitat:
Orginal von php-elite.de
nö ab 5.2

EDIT: schau mal auf der Zeit, dein Edit war noch nicht vorhanden als ich gepostet habe

Ja, so kannst kommen, gell?


23.04.2011, 22:57 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2496
      Zitat | Bearbeiten

Zitat:
Orginal von Dennis1993
[..]
Zitat:
Orginal von DingsDaBums
?? Das ist doch mit MySQL...


MySQLi ist es. Hast du wahrscheinlich übersehen


Hab gedacht mit Mysql meint er die Datenbank. Also das er gerne ein System mit Datenbank und nicht mit einer Textdatei z.B. haben möchte.


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
03.05.2011, 19:32 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Hallo Dennis1993,

ich setzte das Script von Dir ein und bin begeistert.

Jetzt habe ich allerdings noch eine Frage:

Ich könnte schwören, dass ich mich zumindest beim IE nach dem Schließen und wieder neu Öffnen des Browsersmich nicht erneut anmelden musste, sondern erst dann, wenn ich mich zuvor über Logout abgemeldet habe. Seit heute ist das anders (habe auf dem Webspace mit der PHP Version experementiert).

Schließe ich das Browserfenster und öffne es gleich wieder, muss ich mich erneut anmelden um auf die Seiten zu gelangen.

Frage: Wie ist das ursprünglich von Dir vorgesehen bzw. wann sollte eine neue Anmeldung erforderlich werden?

1.) Schon beim Schließen des Browserfensters?

2.) Auch schon dann, wenn ich aus dem geöffneten Browserfenster eine andere Seite aufrufe und dann wieder auf meine Seite zurückkehre?

3.) Wie verhält es sich darüber hinaus, wenn ich aus dem geöffneten Browserfenster alles lösche (Cookies, Temporäre Dateien etc.)?

Ich würde gerne mal prüfen ob alles korrekt läuft.

Vielen Dank für Deine Unterstützung.



09.05.2011, 21:53  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2496
      Zitat | Bearbeiten

Zitat:
Orginal von Gast
Hallo Dennis1993,

ich setzte das Script von Dir ein und bin begeistert.

Jetzt habe ich allerdings noch eine Frage:

Ich könnte schwören, dass ich mich zumindest beim IE nach dem Schließen und wieder neu Öffnen des Browsersmich nicht erneut anmelden musste, sondern erst dann, wenn ich mich zuvor über Logout abgemeldet habe. Seit heute ist das anders (habe auf dem Webspace mit der PHP Version experementiert).

Schließe ich das Browserfenster und öffne es gleich wieder, muss ich mich erneut anmelden um auf die Seiten zu gelangen.

Frage: Wie ist das ursprünglich von Dir vorgesehen bzw. wann sollte eine neue Anmeldung erforderlich werden?

1.) Schon beim Schließen des Browserfensters?

2.) Auch schon dann, wenn ich aus dem geöffneten Browserfenster eine andere Seite aufrufe und dann wieder auf meine Seite zurückkehre?

3.) Wie verhält es sich darüber hinaus, wenn ich aus dem geöffneten Browserfenster alles lösche (Cookies, Temporäre Dateien etc.)?

Ich würde gerne mal prüfen ob alles korrekt läuft.

Vielen Dank für Deine Unterstützung.



Das kommt oft auf die PHP Einstellungen auf dem Server an.


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
10.05.2011, 13:57 Profil | PM | E-Mail  


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
      Zitat | Bearbeiten

Da das ganze über eine Session gehalten wird, muss man sich erst neu anmelden, wenn man den Broser geschlossen hat oder eben auf "Abmelden" gedrückt hat.
Man kann, wenn man angemeldet ist, auch das login.php-Script nochmal aufrufen um sich mit einem anderen Account anzumelden. Wenn man das nicht tut, bleibt man aber mit dem alten Account angemeldet.

Also: Browser schleißen => Neue Anmeldung erforderlich
"Abmelden-Button" => Neue Anmeldung
Sonst bleibt man angemeldet.


14.05.2011, 12:42 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Besten Dank!

Alles verstanden !

VG


19.05.2011, 19:29  
Gast


      Zitat | Bearbeiten

das script läuft echt super, danke dafür!


10.07.2011, 11:10  
Gast


      Zitat | Bearbeiten

ich weiss dieser beitrag ist bereits älter
aber ich habe es als ein super tutorial empfunden...

meine frage noch für die datei login.php
hiert müsste doch die form anschliessend auf die datei intern.php verweisen???

<form action="intern.php" method="post">


im tutorial verweist die form auf login.php
aber da müsste doch der zielverweis hin? sonst wird man ja nicht weitergeleitet...?


26.10.2011, 14:54  


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
      Zitat | Bearbeiten

Hey,

nein, login.php ist schon richtig in der Form, weil sich das Script in der login.php selbst befindet.
In Zeile 49 wird der Benutzer automatisch auf die intern.php weitergeleitet, wenn der Login korrekt war.


26.10.2011, 15:18 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

ah ok, gut besten dank für die auskunft..
leider funktioniert es bei mir nicht richtig. 1-2 mal konnte ich mich einloggen aber meistens nicht oder dann kommt anschliessend nur ne weisse seite (darum dachte ich die weiterleitung an intern.php) funktioniert nicht....


26.10.2011, 15:42  
Gast


      Zitat | Bearbeiten

also es ist so habe es nochmals getestet:

ich logge mich ein ich werde weitergeleitet an eine komplett weisse seite und oben in der url steht immer noch www.xxx.com/login.php

es scheint also das die weiterleitung an intern.php nicht funktioniert.

die anmeldung hat aber eigentlich funktioniert denn ich kann im browser anschliessend direkt via url auf www.xxx.com/intern.php zugreiffen was ansonsten ja nicht funktionieren würde...


26.10.2011, 15:49  


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
      Zitat | Bearbeiten

Welche PHP/MySQL-Version nutzt du?

Sonst probiert mal folgendes: Öffne bitte die config.php und ändere Zeile 22
 PHP 
1:
ini_set('display_errors', false);

wie folgt ab
 PHP 
1:
ini_set('display_errors', true);


Dann führe nochmals einen Login durch. Nun sollte die weiße Seite Fehlermeldungen zeigen.
Die kannst du hier mal posten oder selbst beheben, wenn du weißt woran es liegt




Post wurde schon 2x editiert, das letzte mal am 26.10.2011 um 16:06 von
26.10.2011, 16:06 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Zitat:
Orginal von Dennis1993
Dann führe nochmals einen Login durch. Nun sollte die weiße Seite Fehlermeldungen zeigen.
Die kannst du hier mal posten



ok habe deinen rat befolgt und hier die meldung:

Zitat:
Warning: Cannot modify header information - headers already sent by
(output started at
/home/xxx/public_html/config.php:32) in /home/xxx/public_html/login.php on line 45



26.10.2011, 16:11  
beatles
Mitglied
Gruenling


Dabei seit: 24.08.2011
Herkunft: Schweiz
Posts: 13
      Zitat | Bearbeiten

so habe bemerkt dass ich ja hier einmal einen Account angelegt habe :-) also ich bin der Gast mit dem Problem was oben beschrieben ist...

Hier nochmals schöner dargestellt:

 PHP 
1:
Warning: Cannot modify header information - headers already sent by (output started at /home/xxx/public_html/config.php:32) in /home/xxx/public_html/login.php on line 45


Ich brauche hierzu Hilfe....
Er kann die Session nicht im header von intern.php eintragen??


26.10.2011, 17:05 Profil | PM | E-Mail  


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
      Zitat | Bearbeiten

Hast du irgendwo ein Leerzeichen vorher ausgegeben?
Die Fehlermeldung sagt nämlich aus, dass er die Session nicht starten kann, da schon eine Ausgabe getätigt wurde.

Um es beeser zu verdeutlichen: Du kannst schlecht in einen Bus einsteigen, wenn er schon abgefahren ist.

Prüfe mal, ob do irgendwo vor/über session_start() eine Leerzeile/Leerzeichen ist. Das muss dann nämlich weg. Als erstes muss nämlich session_start() kommen und dann erst der Rest.


26.10.2011, 17:26 Profil | PM | E-Mail  
beatles
Mitglied
Gruenling


Dabei seit: 24.08.2011
Herkunft: Schweiz
Posts: 13
      Zitat | Bearbeiten

hmm ich habe nochmals alle drei dateien direkt vom tutorial kopiert und so übernommen...
(db infos habe ich natürlich verändert)

aber es erscheint immer noch die gleiche meldung wobei sich der fehler in der zeile verschoben hat von 45 -> 49:

 PHP 
1:
Warning: Cannot modify header information - headers already sent by (output started at /home/xxx/public_html/config.php:35) in /home/xxx/public_html/login.php on line 49





Post wurde schon 1x editiert, das letzte mal am 26.10.2011 um 17:35 von beatles
26.10.2011, 17:34 Profil | PM | E-Mail  


Neuling


Dabei seit: 01.01.1970
Herkunft:
Posts:
      Zitat | Bearbeiten

Ich habe mir das Tutorial gerade selbst noch einmal durchgeführt und bei mir läuft es problemlos. Habe dir meine Dateien einfach mal angehangen. Bitte mal ALLE Dateien ersetzen und die Zugangsdaten in der Config entsprechend anpassen.

Das sollte eigentlich laufen...

Dateianhang:
 tutorial.zip  (2 KB, 534 mal herruntergeladen)

26.10.2011, 17:53 Profil | PM | E-Mail  
Seiten (4):  1  2  3  4 
PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » PHP Login Script mit Prepared-Statements, MySQLi und HTML5   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz