Antworten auf deine Fragen:
Neues Thema erstellen

Probleme beim Login-Skript

mak_x

Fotograf aus Leidenschaft

hi zusammen,

ich versuche einmal mein glück in diesem bereich des forums. ich bin in php und mysql nicht so bewandert, habe mich aber trotzdem einmal den ganzen nachmittag mit dem profi-login-skript von phpbuddy befasst und soweit mehr oder weniger verstanden.

als basis habe ich seine dateien gemäss nachstehendem link verwendet



zusätzlich habe ich in der datenbank bei jedem benutzer eine eigene 'url' hinterlegt, mit dem ziel, dass bei erfolgreichem login der benutzer auf diese für ihn angepasst webseite gelangt.

nun scheitert bei mir der versuch die passenden daten aus der dataenbank auszulesen. hier der gesamte code der datei 'login_profi.php'

Code:
<?php

// Fehlermeldungen unterdrücken
error_reporting( 0 );

// Erzwingen das Session-Cookies benutzt werden und die SID nicht per URL transportiert wird
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
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)
        {
            // Auf geheime Seite weiterleiten
            header( 'location: geheim_profi.php' );
            exit;
        }
        else
        {
            $fehlermeldung = '<h3>Bei der Anmeldung ist ein Problem aufgetreten!</h3>';
        }
    }
    else
    {
        $fehlermeldung = '<h3>Die Anmeldung war fehlerhaft!</h3>';
    }
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>phpBuddy.eu - Login Script</title>
</head>

<body>

<?php
// Falls die Fehlermeldung gesetzt ist
if ($fehlermeldung) echo $fehlermeldung;
?>

<form id="loginform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <label for="benutzer">Benutzer: </label><input type="text" name="benutzer" id="benutzer" value="" /><br />
    <label for="passwort">Passwort: </label><input type="password" name="passwort" id="passwort" value="" /><br />
    <input type="submit" name="login" id="login" value="Anmelden" />
</form>

</body>
</html>
und hier noch der code der 'funktionen.inc.php' die wiederum bestandteil der login-profi-php-Datei ist

Code:
<?php

/* *************************** */
/* *** Datenbankverbindung *** */
/* *************************** */
function db_connect()
{
    // Zugangsdaten für die DB
    $dbhost = 'localhost';
    $dbuser = 'user';
    $dbpass = 'password';
    $dbname = 'login';
    // 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_zusatz`
            FROM
                `login_profi`
            WHERE
                LOWER(`benutzername`) = '" .mysql_real_escape_string( $benutzer ). "' AND
                `aktiviert` = 1";
    // 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
        $zusatz    = $datensatz['passwort_zusatz'];
        $anmeldepw = md5( $passwort.$zusatz );
        // Anweisung zusammenstellen
        $sql = "SELECT
                    `id`, `fehlversuche`
                FROM
                    `login_profi`
                WHERE
                    LOWER(`benutzername`) = '" .mysql_real_escape_string( $benutzer ). "' AND
                    `passwort` = '" .mysql_real_escape_string( $anmeldepw ). "' AND
                    `aktiviert` = 1";
        // 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
                            `login_profi`
                        SET
                            `fehlversuche` = 0
                        WHERE
                            LOWER(`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
                        `login_profi`
                    SET
                        `fehlversuche` = `fehlversuche` + 1
                    WHERE
                        LOWER(`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
                        `login_profi`
                    WHERE
                        LOWER(`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
                            `login_profi`
                        SET
                            `fehlversuche` = 0,
                            `aktiviert` = 0
                        WHERE
                            LOWER(`benutzername`) = '" .mysql_real_escape_string( $benutzer ). "'
                        LIMIT
                            1";
                mysql_query( $sql, $conid );
            }
        }
    }
}

/* **************************************** */
/* *** Benutzer Datensatz aktualisieren *** */
/* **************************************** */
function updateUser( $benutzer, $conid )
{
    // Benutzer-Datensatz aktualisieren
    $sql = "UPDATE
                `login_profi`
            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
                LOWER(`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
                `login_profi`
            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
                `login_profi`
            SET
                `zuletzt_aktiv` = NOW()
            WHERE
                LOWER(`benutzername`) = '" .mysql_real_escape_string( $_SESSION['benutzername'] ). "'
            LIMIT
                1";
    mysql_query( $sql, $conid );
    // Status zurückgeben
    return true;
}

/* ************************* */
/* *** Benutzer abmelden *** */
/* ************************* */
function resetUser()
{
    session_destroy();
    header( 'location: login_profi.php' );
    exit;
}

?>
ich muss irgendwie den verweis auf die datei 'geheim_profi.php' mit dem in der datenbank hinterlegten wert 'webseite' ersetzen können (sh. untenstehenden) auszug.

Code:
            // Auf geheime Seite weiterleiten
            header( 'location: geheim_profi.php' );
            exit;
da dieser code-ausschnitt nach der erfolgreichen prüfung von benutzername und passwort erfolgt, denke ich, dass es nicht so schwer sei kann aber ich komme nicht darauf. vielleicht habt ihr eine idee um einem anfänger in sachen php auf die sprünge zu helfen. ich wäre euch wirlich sehr sehr sehr dankbar.

liebe grüsse und euch allen ein gutes 2013!!!!!
marcel
 

Duddle

Posting-Frequenz: 14µHz

AW: Probleme beim Login-Skript

nun scheitert bei mir der versuch die passenden daten aus der dataenbank auszulesen
Wo in deinem Ausschnitt ist dein eigener Versuch? Ich sehe keinerlei Code, der die Datenbank mit deinem genannten Ziel auslesen will.

Edit: Die Grundidee sollte dir selbst eingefallen sein: lies die URL aus der DB und wirf diese in die Umleitungs-Funktion. Wenn du nicht weißt, wie einer dieser beiden Schritte funktioniert, musst du dir ein paar durchlesen.


Duddle
 

mak_x

Fotograf aus Leidenschaft

AW: Probleme beim Login-Skript

hi duddle,
das ist korrekt, im geposteten code sind meine kläglichen versuche nirgends zu sehen, da sie nicht funktioniert haben und auch nur sehr laienhaft waren.
die grundidee ist mir natürlich eingefallen aber die umsetzung nicht - ich gebe zu, dass ich nicht wirklich über viel php-kenntnisse verfüge und mir ein wenig die zeit fehlt um mich in dieses gebiet voll einzulesen aber danke für deinen link. ich habe diesen kurz überflogen - es wird wohl ein langer weg sein, dass alles durchzuarbeiten.
 

Duddle

Posting-Frequenz: 14µHz

AW: Probleme beim Login-Skript

Es gibt - meiner Erfahrung nach - immer 2 Wege, um etwas umzusetzen: entweder eignest du dir das dafür notwendige Wissen an und machst es, oder du findest jemanden (in der Regel gegen Bezahlung) der es dir macht.

Entweder lernst du es also und fragst bei Hürden hier nach, oder du bezahlst einen Profi. Natürlich kannst du auch darauf hoffen, dass jemand aus freien Zügen die Lösung hier reinstellt, sowas kommt auch vor :)


Duddle
 

mak_x

Fotograf aus Leidenschaft

AW: Probleme beim Login-Skript

schon klar was du meinst - wer weiss, vielleicht habe ich glück und es ergibt sich eine lösung hier. für einen profi wird mein 'problem' vermutlich verschwindend klein sein.

ansonsten bleibt mir dann nur noch das 'selbstlernen' - mal sehen :)
 
N

NaliWarCow

Guest

AW: Probleme beim Login-Skript

Hi,

eine Möglichkeit ist beim erfolgreichen einloggen die Url abzurufen und zu übergeben.
Hierzu müsstest du folgende Anpassungen vornehmen:

login_profi.php:

Nach

if ($anmeldung)
{

dies einfügen:
PHP:
$url = 'geheim_profi.php';
if(is_bool($anmeldung) === false)
$url = $anmeldung;

Somit wird, falls $anmeldung kein Boolean ist(sondern die URL), $url auf den Wert aus $anmeldung gesetzt.

die Zeile

header( 'location: geheim_profi.php' );

wird durch

PHP:
header( 'location: '.$url );

ersetzt.

Nun wird, falls $anmeldung ein Boolean ist, 'geheim_profi.php' aufgerufen und wenn nicht, wird die Seite aufgerufen, welche in $anmeldung übergeben wurde.


Nun müssen wir natürlich noch dafür sorgen, dass wir auch die URL übergeben bekommen, falls eine für den User im Feld "url" hinterlegt ist.


funtionen.inc.php:

// Anweisung zusammenstellen
$sql = "SELECT
`id`, `fehlversuche`
FROM
`login_profi`
WHERE
LOWER(`benutzername`) = '" .mysql_real_escape_string( $benutzer ). "' AND
`passwort` = '" .mysql_real_escape_string( $anmeldepw ). "' AND
`aktiviert` = 1";

wird zu

PHP:
// Anweisung zusammenstellen
        $sql = "SELECT
                    `id`, `fehlversuche`, `url`
                FROM
                    `login_profi`
                WHERE
                    LOWER(`benutzername`) = '" .mysql_real_escape_string( $benutzer ). "' AND
                    `passwort` = '" .mysql_real_escape_string( $anmeldepw ). "' AND
                    `aktiviert` = 1";


Also der Abfrage wurde bei den abzurufenden Feldern "url" hinzugefügt.


// Counter für Fehlversuche resetten
$angriff = mysql_fetch_array( $ergebnis );
if ($angriff['fehlversuche'] != 0)
{

wird zu

PHP:
// Counter für Fehlversuche resetten
$abfrage = mysql_fetch_array( $ergebnis );
$url = $abfrage['url'];
if ($abfrage['fehlversuche'] != 0)
{


Vor

return true;

wird hinzugefügt:

PHP:
if(!empty($url))
return $url;


Was wir nun hier gemacht haben, ist:

1. URL wird mitabgefragt
2. $url erhält die URL aus der DB
3. Wenn $url nicht leer ist, wird $url übergeben, ansonsten true


Hoffe es war alles verständlich und es funktioniert alles bei dir.

Falls noch Fragen sind, dann nur zu. ;)

Gruß
Nali
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben