Hallo liebes PHP-Forum,
ich habe seit geraumer Zeit ein Problem mit meiner Authentifizierung am Webserver. Ich habe damals für meine Plattform eine Tutorial benutzt, für Login und Registrierung und dieses in meine PHP-Seite eingebunden. Seit einiger Zeit werde ich manchmal einfach ausgeloggt, während ich auf der Plattform Einträge ändere und speichere. Mittlerweile ist es jedoch so, dass ich mich gar nicht mehr einloggen kann. Ich gebe meine Benutzerdaten an, klicke auf Einloggen und ich bin wieder beim Login. Oder ich logge mich ein, bin ein paar Sekunden eingeloggt und sobald ich den nächsten Klick auf eine Seite mache, lande ich wieder beim Login. Woran könnte das liegen?
Hier der relevante Quelltext:
Index.php
Hier die relevanten Funktionen die aufgerufen werden:
functionen.inc.php
Weißt jemand von euch woran das liegen könnte?
Das Problem ist kurzzeitig weg, wenn ich etwas im Quelltext ändere und die Datei erneut hochlade. Dann dachte ich schon an Probleme mit den Cookies. Jedoch bleibt das Problem auch nach Löschen dieser vorhanden.
Vielleicht kann jemand von euch weiterhelfen?
Viele Grüße,
Colin
ich habe seit geraumer Zeit ein Problem mit meiner Authentifizierung am Webserver. Ich habe damals für meine Plattform eine Tutorial benutzt, für Login und Registrierung und dieses in meine PHP-Seite eingebunden. Seit einiger Zeit werde ich manchmal einfach ausgeloggt, während ich auf der Plattform Einträge ändere und speichere. Mittlerweile ist es jedoch so, dass ich mich gar nicht mehr einloggen kann. Ich gebe meine Benutzerdaten an, klicke auf Einloggen und ich bin wieder beim Login. Oder ich logge mich ein, bin ein paar Sekunden eingeloggt und sobald ich den nächsten Klick auf eine Seite mache, lande ich wieder beim Login. Woran könnte das liegen?
Hier der relevante Quelltext:
Index.php
PHP-Code:
<?php
// Fehlermeldungen anzeigen
error_reporting('on');
ini_set('display_errors', 'on');
// Erzwingen das Session-Cookies benutzt werden und die SID nicht per URL transportiert wird
ini_set( 'session.use_cookies', '1' );
ini_set( 'session.use_only_cookies', '1' );
ini_set( 'session.use_trans_sid', '0' );
// Session starten
session_start();
// Sicherstellen das die SID durch den Server vergeben wurde
// um einen möglichen Session Fixation Angriff unwirksam zu machen
if (!isset( $_SESSION['server_SID'] )) {
// Möglichen Session Inhalt löschen
session_unset();
// Ganz sicher gehen das alle Inhalte der Session gelöscht sind
$_SESSION = array();
// Session zerstören
session_destroy();
// Session neu starten
session_start();
// Neue Server-generierte Session ID vergeben
session_regenerate_id();
// Status festhalten
$_SESSION['server_SID'] = true;
}
// Funktionen einbinden
include('funktionen.inc.php');
// Variablen deklarieren
$_SESSION['angemeldet'] = false;
$conid = '';
$eingabe = array();
$anmeldung = false;
$update = false;
$fehlermeldung = '';
// Datenbankverbindung öffnen
$conid = db_connect();
// Wenn das Formular abgeschickt wurde
$notcorrect = false;
if (isset( $_POST['login'] )) {
// Benutzereingabe bereinigen
$eingabe = cleanInput();
// Benutzer anmelden
$anmeldung = loginUser( $eingabe['benutzername'], $eingabe['passwort'], $conid );
// Anmeldung war korrekt
if ($anmeldung) {
// Benutzer Identifikationsmerkmale in DB speichern
$update = updateUser( $eingabe['benutzername'], $conid );
// Bei erfolgreicher Speicherung
if ($update) {
$admin = checkAdmin( $conid );
$user = checkUser( $conid );
//$oldUser = checkOldUser( $conid );
if ($admin) {
// auf Chefseite weiterleiten
header ( 'location:admin/adminHome.php' );
exit;
} else {
// auf Mitarbeiterbereich weiterleiten
header ( 'location:mitarbeiter/mitarbeiterHome.php' );
exit;
}/* else {
// auf alte Mitarbeiterbereich weiterleiten
header ( 'location:mitarbeiterAlt/Home.php' );
exit;
}*/
// Fehlermeldung falls nicht Mitarbeiter nicht erfolgreich aktualisiert wurde
} else {
$fehlermeldung = '<h3><font color="orange">Bei der Anmeldung ist ein Problem aufgetreten.</font></h3>';
}
// Fehlermeldung falls Eingabedaten nicht korrekt / Mitarbeiter noch nicht aktiviert
} else {
$fehlermeldung = '<h3><font color="orange">Eingabe nicht korrekt oder Konto noch nicht aktiviert.</font></h3>';
$notcorrect = true;
}
}
?>
functionen.inc.php
PHP-Code:
<?php
/* *************************** */
/* *** Datenbankverbindung *** */
/* *************************** */
function db_connect()
{
// Zugangsdaten für die DB
....
// Verbindung herstellen und Verbindungskennung zurück geben
$conid = mysql_connect( $dbhost, $dbuser, $dbpass ) or die( 'Verbindungsfehler!' );
if (is_resource( $conid ))
{
mysql_select_db( $dbname, $conid ) or die( 'Datenbankfehler!' );
}
return $conid;
}
/* ********************************** */
/* *** Benutzereingabe bereinigen *** */
/* ********************************** */
function cleanInput()
{
// Maskierende Slashes aus POST Array entfernen
if (get_magic_quotes_gpc())
{
$eingabe['benutzername'] = stripslashes( $_POST['benutzer'] );
$eingabe['passwort'] = stripslashes( $_POST['passwort'] );
}
else
{
$eingabe['benutzername'] = $_POST['benutzer'];
$eingabe['passwort'] = $_POST['passwort'];
}
// Trimmen
//$eingabe['benutzername'] = trim( $eingabe['benutzername'] );
//$eingabe['passwort'] = trim( $eingabe['passwort'] );
// In Kleinschrift umwandeln
//$eingabe['benutzername'] = strtolower( $eingabe['benutzername'] );
// Eingabe zurückgeben
return $eingabe;
}
/* ************************* */
/* *** Benutzer anmelden *** */
/* ************************* */
function loginUser( $benutzer, $passwort, $conid )
{
// Anweisung zusammenstellen
$sql = "SELECT
`passwort`
FROM
`mitarbeiter`
WHERE
`benutzername` = '" .mysql_real_escape_string( $benutzer ). "'
AND
(`aktiviert` = 1 OR `aktiviert` = 'Nein')";
// Anweisung an DB schicken
$ergebnis = mysql_query( $sql, $conid );
// Wurde ein Datensatz gefunden, existiert dieser Benutzername, also
// prüfen wir ob die Anmeldedaten korrekt ist
if (mysql_num_rows($ergebnis) == 1)
{
$datensatz = mysql_fetch_array( $ergebnis );
// Resourcen freigeben
mysql_free_result( $ergebnis );
// Anmeldepasswort vorbereiten
$anmeldepw = md5( $passwort );
// Anweisung zusammenstellen
$sql = "SELECT
`mitarbeiterID`, `fehlversuche`
FROM
`mitarbeiter`
WHERE
`benutzername` = '" .mysql_real_escape_string( $benutzer ). "' AND
`passwort` = '" .mysql_real_escape_string( $anmeldepw ). "' AND
(`aktiviert` = 1 OR `aktiviert` = 'Nein')";
// Anweisung an DB schicken
$ergebnis = mysql_query( $sql, $conid );
// Prüfen ob ein Datensatz gefunden wurde. In dem Fall stimmen die Anmeldedaten
if (mysql_num_rows( $ergebnis ) == 1)
{
// Counter für Fehlversuche resetten
$angriff = mysql_fetch_array( $ergebnis );
if ($angriff['fehlversuche'] != 0)
{
$sql = "UPDATE
`mitarbeiter`
SET
`fehlversuche` = 0
WHERE
`benutzername` = '" .mysql_real_escape_string( $benutzer ). "'
LIMIT
1";
mysql_query( $sql, $conid );
}
// Resourcen freigeben
mysql_free_result( $ergebnis );
// Korrekte Anmeldung zurückgeben
return true;
}
else
{
// Das angegebene Passwort war nicht korrekt, also gehen wir von einem Angriffsversuch aus
// und erhöhen den Counter der fehlerhaften Anmeldeversuche
$sql = "UPDATE
`mitarbeiter`
SET
`fehlversuche` = `fehlversuche` + 1
WHERE
`benutzername` = '" .mysql_real_escape_string( $benutzer ). "'
LIMIT
1";
mysql_query( $sql, $conid );
// Abfragen ob das Limit von 10 Fehlversuche erreicht wurde und in diesem Fall ...
$sql = "SELECT
`fehlversuche`
FROM
`mitarbeiter`
WHERE
`benutzername` = '" .mysql_real_escape_string( $benutzer ). "'";
$ergebnis = mysql_query( $sql, $conid );
$anzahl = mysql_fetch_array( $ergebnis );
mysql_free_result( $ergebnis );
// ... das Konto deaktivieren
if ($anzahl['fehlversuche'] > 9)
{
$sql = "UPDATE
`mitarbeiter`
SET
`fehlversuche` = 0,
`aktiviert` = 0
WHERE
`benutzername` = '" .mysql_real_escape_string( $benutzer ). "'
LIMIT
1";
mysql_query( $sql, $conid );
}
}
}
}
/* **************************** */
/* *** Administrator prüfen *** */
/* **************************** */
function checkAdmin( $conid )
{
// Alte Session löschen und Sessiondaten in neue Session transferieren
session_regenerate_id( true );
// Benutzerdaten aus DB laden
$sql = "SELECT
`ip`, `benutzerinfo`, `anmeldung`, UNIX_TIMESTAMP(`zuletzt_aktiv`) as zuletzt_aktiv
FROM
`mitarbeiter`
WHERE
`benutzername` = '" .mysql_real_escape_string( $_SESSION['benutzername'] ). "' AND
`admin` = 1";
$ergebnis = mysql_query( $sql, $conid );
if (mysql_num_rows( $ergebnis ) == 1)
{
$benutzerdaten = mysql_fetch_array( $ergebnis );
// Resourcen freigeben
mysql_free_result( $ergebnis );
// Daten aus der DB mit den Benutzerdaten vergleichen
if ($benutzerdaten['ip'] != $_SERVER['REMOTE_ADDR']) return false;
if ($benutzerdaten['benutzerinfo'] != $_SERVER['HTTP_USER_AGENT']) return false;
if ($benutzerdaten['anmeldung'] != $_SESSION['anmeldung']) return false;
if (($benutzerdaten['zuletzt_aktiv'] + 600) <= $_SERVER['REQUEST_TIME']) return false;
}
else
{
return false;
}
// Wenn die Benutzerdaten okay sind
// Letzte Aktivität aktualisieren
$sql = "UPDATE
`mitarbeiter`
SET
`zuletzt_aktiv` = NOW()
WHERE
`benutzername` = '" .mysql_real_escape_string( $_SESSION['benutzername'] ). "'
LIMIT
1";
mysql_query( $sql, $conid );
// Status zurückgeben
return true;
}
/* **************************************** */
/* *** Benutzer Datensatz aktualisieren *** */
/* **************************************** */
function updateUser( $benutzer, $conid )
{
// Benutzer-Datensatz aktualisieren
$sql = "UPDATE
`mitarbeiter`
SET
`ip` = '" .mysql_real_escape_string( $_SERVER['REMOTE_ADDR'] ). "',
`benutzerinfo` = '" .mysql_real_escape_string( $_SERVER['HTTP_USER_AGENT'] ). "',
`anmeldung` = '" .mysql_real_escape_string( md5( $_SERVER['REQUEST_TIME'] ) ). "',
`zuletzt_aktiv` = NOW()
WHERE
`benutzername` = '" .mysql_real_escape_string( $benutzer ). "'
LIMIT
1";
mysql_query( $sql, $conid );
// Prüfen ob der datensatz aktualisiert wurde
if (mysql_affected_rows( $conid ) == 1)
{
// Session Variablen setzen
$_SESSION['angemeldet'] = true;
$_SESSION['benutzername'] = $benutzer;
$_SESSION['anmeldung'] = md5( $_SERVER['REQUEST_TIME'] );
return true;
}
}
/* *********************************** */
/* *** Status des Benutzers prüfen *** */
/* *********************************** */
function checkUser( $conid )
{
// Alte Session löschen und Sessiondaten in neue Session transferieren
session_regenerate_id( true );
if ($_SESSION['angemeldet'] !== true) return false;
// Benutzerdaten aus DB laden
$sql = "SELECT
`ip`, `benutzerinfo`, `anmeldung`, UNIX_TIMESTAMP(`zuletzt_aktiv`) as zuletzt_aktiv
FROM
`mitarbeiter`
WHERE
`benutzername` = '" .mysql_real_escape_string( $_SESSION['benutzername'] ). "' AND
`aktiviert` = 1";
$ergebnis = mysql_query( $sql, $conid );
if (mysql_num_rows( $ergebnis ) == 1)
{
$benutzerdaten = mysql_fetch_array( $ergebnis );
// Resourcen freigeben
mysql_free_result( $ergebnis );
// Daten aus der DB mit den Benutzerdaten vergleichen
if ($benutzerdaten['ip'] != $_SERVER['REMOTE_ADDR']) return false;
if ($benutzerdaten['benutzerinfo'] != $_SERVER['HTTP_USER_AGENT']) return false;
if ($benutzerdaten['anmeldung'] != $_SESSION['anmeldung']) return false;
if (($benutzerdaten['zuletzt_aktiv'] + 600) <= $_SERVER['REQUEST_TIME']) return false;
}
else
{
return false;
}
// Wenn die Benutzerdaten okay sind
// Letzte Aktivität aktualisieren
$sql = "UPDATE
`mitarbeiter`
SET
`zuletzt_aktiv` = NOW()
WHERE
`benutzername` = '" .mysql_real_escape_string( $_SESSION['benutzername'] ). "'
LIMIT
1";
mysql_query( $sql, $conid );
// Status zurückgeben
return true;
}
/* *********************************** */
/* *** Status des Benutzers prüfen *** */
/* *********************************** */
function checkOldUser( $conid )
{
// Alte Session löschen und Sessiondaten in neue Session transferieren
session_regenerate_id( true );
if ($_SESSION['angemeldet'] !== true) return false;
// Benutzerdaten aus DB laden
$sql = "SELECT
`ip`, `benutzerinfo`, `anmeldung`, UNIX_TIMESTAMP(`zuletzt_aktiv`) as zuletzt_aktiv
FROM
`mitarbeiter`
WHERE
`benutzername` = '" .mysql_real_escape_string( $_SESSION['benutzername'] ). "' AND
`aktiviert` = 'Nein'";
$ergebnis = mysql_query( $sql, $conid );
if (mysql_num_rows( $ergebnis ) == 1)
{
$benutzerdaten = mysql_fetch_array( $ergebnis );
// Resourcen freigeben
mysql_free_result( $ergebnis );
// Daten aus der DB mit den Benutzerdaten vergleichen
if ($benutzerdaten['ip'] != $_SERVER['REMOTE_ADDR']) return false;
if ($benutzerdaten['benutzerinfo'] != $_SERVER['HTTP_USER_AGENT']) return false;
if ($benutzerdaten['anmeldung'] != $_SESSION['anmeldung']) return false;
if (($benutzerdaten['zuletzt_aktiv'] + 600) <= $_SERVER['REQUEST_TIME']) return false;
}
else
{
return false;
}
// Wenn die Benutzerdaten okay sind
// Letzte Aktivität aktualisieren
$sql = "UPDATE
`mitarbeiter`
SET
`zuletzt_aktiv` = NOW()
WHERE
`benutzername` = '" .mysql_real_escape_string( $_SESSION['benutzername'] ). "'
LIMIT
1";
mysql_query( $sql, $conid );
// Status zurückgeben
return true;
}
?>
Das Problem ist kurzzeitig weg, wenn ich etwas im Quelltext ändere und die Datei erneut hochlade. Dann dachte ich schon an Probleme mit den Cookies. Jedoch bleibt das Problem auch nach Löschen dieser vorhanden.
Vielleicht kann jemand von euch weiterhelfen?
Viele Grüße,
Colin
Kommentar