tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von saftmeister
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
749
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    karton karton ist offline Grünschnabel
    Registriert seit
    Nov 2011
    Beiträge
    3
    Hallo zusammen und bitte um Hilfe!

    Ich hab mir mühsam - als blutiger Anfänger - aus einigen Befehlen und aus Vorlagen ein Login-Script zusammengebastelt, welches "fast" funktionert.

    Es geht darum, dass auf der zu schützenden Seite nur das Passwort relevant ist. Die Besucher sehen beim Loginformular nur 1 Eingabefeld. User gibt es keinen. Dieses Passwort wird dann mit den in der Datenbank gespeicherten Codes (ohne MD5 Verschlüsselung) verglichen und lässt bei Übereinstimmung den Zugriff zu oder eben nicht. (Nur zum Verständnis der Hintergrund der ganzen Sache: Es ist wie ein Aktionscode, den die Nutzer da eingeben. Den Code erhalten sie in meinem Lokal. Auf der geschützten Seite sind dann diverse Goodies zum runterladen.)


    Alles funktioniert. Falsche Code - kein Zugriff. Richtiger Code - Zugriff gewährt.
    Jedoch: Wenn man gar keinen Code eingibt, landet man dennoch auf der geschützten Seite.
    Wieso das ? Kann mir da irgendjemand von Euch Profis bitte mal weiterhelfen ? Und erklären, was da zu tun ist ?

    Hier das Login-Script:
    PHP-Code:
    <?php
    session_start
    ();
    ?>

    <?php
    //Abschalten der nervigen NOTICE Meldung...
    error_reporting(E_ALL & ~ E_NOTICE);

    //DB Verbindung herstellen
    $verbindung mysql_connect("datenbankserver""dbusername" "dbpasswort")
    or die(
    "Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("datenbankname") or die ("Datenbank konnte nicht ausgewählt werden");

    //$username = $_POST["username"];
    //$passwort = md5($_POST["password"]); Nur Passwortabfrage und ohne MD5
    $passwort $_POST["password"];

    //$abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
    $abfrage "SELECT passwort FROM login WHERE passwort LIKE '$passwort' LIMIT 1";

    $ergebnis mysql_query($abfrage);
    $row mysql_fetch_object($ergebnis);

    if(
    $row->passwort == $passwort)
        {
        
    $_SESSION["username"] = $passwort;
        echo 
    "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>";
        }
    else
        {
        
    //echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";
        
    header('Location: http://www.google.at');
    }
    ?>
    Von da an gehts dann auf die geschütze Seiten, in denen ich folgendes ganz am Anfang eingefügt habe:

    PHP-Code:
    <?php
    session_start
    ();
    ?>

    <?php
    error_reporting
    (E_ALL & ~ E_NOTICE);
    if(!isset(
    $_SESSION["username"]))
       {
       echo 
    "Bitte erst <a href=\"login.html\">einloggen</a>";
       exit;
       }
    ?>
    Und wie beende ich nun die Session ?
    Eigenes Script welches über einen Button aufgerufen wird ?
    Oder muss das auf irgendeine Seite ?

    Ihr seht - ich bin echt blutiger aber sehr interessierter Anfänger und bitte echt um Hilfe.
    Danke schon mal!
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Versuch mal das:

    Code 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
    
    <?php
    session_start();
    ?>
     
    <?php
    //Abschalten der nervigen NOTICE Meldung...
    //error_reporting(E_ALL & ~ E_NOTICE);
    // Fehler und Warnungen haben einen Sinn!
    error_reporting(E_ALL|E_STRICT);
     
    //DB Verbindung herstellen
    $verbindung = mysql_connect("datenbankserver", "dbusername" , "dbpasswort")
    or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("datenbankname") or die ("Datenbank konnte nicht ausgewählt werden");
     
    //$username = $_POST["username"];
    //$passwort = md5($_POST["password"]); Nur Passwortabfrage und ohne MD5
    $passwort = isset($_POST["password"]) ? mysql_real_escape_string($_POST['password']) : '';
     
    if($password)
    {
      //$abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
      $abfrage = "SELECT passwort FROM login WHERE passwort LIKE '$passwort' LIMIT 1";
     
      $ergebnis = mysql_query($abfrage);
      $row = mysql_fetch_object($ergebnis);
     
      if($row->passwort == $passwort)
        {
        $_SESSION["username"] = $passwort;
        echo "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>";
        die(); // Hier arbeiten wir nicht mehr weiter...
        }
    }
    //echo "Benutzername und/oder Passwort waren falsch bzw überhaupt nicht gesendet. <a href=\"login.html\">Login</a>";
    header('Location: [url]http://www.google.at');[/url]
    ?>
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    Avatar von Lime
    Lime Lime ist gerade online frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    373
    Also ich kann dir ein Konstrukt beschreiben, wenn ichs programmieren soll brauch ich bisschen mehr Zeit als zwei Minuten.

    Man nehme eine Seite, z.B. index.php
    Diese enthält ein Formular für den Login! Das Formular sendet einen zur Datei index2.php
    Diese Datei enthält zuerst eine session_start, wie du bereits richtig erkannt hast! (evnt. noch session_name dazu)
    Weiter gehts dann damit, dass du - wenn der Login erfolgreich ist, also das Passwort stimmt - eine $_SESSION['username'] vergibst.

    Das alles passiert noch im oberen - unsichtbaren - Teil der index2.php!
    Nun gehen wir zum HTML-Teil über.

    PHP-Code:
    if(isset($_SESSION['username']))
    {
       echo 
    "<p>Geschützter Inhalt.</p>";
    } else {
       echo 
    "<p>Zutritt verwehrt. Möglicherweise falsche Zugangsdaten!</p>";

    Theoretisch hast du es eh nicht schlecht gemacht, aber halt noch ein wenig wirr meiner Meinung nach.
    Wenn du bisschen Zeit hast, schreib ich kurz ein Beispiel.


    index.php
    PHP-Code:
    <?PHP
    session_start
    ();
    session_name('lokal');
    ?>

    <html>
    <head>
       <title>Login</title>
    </head>
    <body>
       <form name="login" method="post" action="index2.php">
          <input type="password" name="userpw" />
          <input type="submit" name="submit" value="Anmelden" />
       </form>
    </body>
    </html>

    index2.php
    PHP-Code:
    <?PHP
    session_start
    ();
    session_name('lokal');
    if(isset(
    $_POST['submit']))
    {
       if(isset(
    $_POST['userpw']))
       {
           
    $sql mysql_connect('localhost','user','pass');
           
    $sqlCmd "SELECT passwort FROM login WHERE passwort LIKE '".$passwort."' LIMIT 1";
           
    $sqlQry mysql_query($sqlCmd,$sql);
           if(
    mysql_num_rows($sqlQry) != 0)
           {
               
    $_SESSION['username'] = $_POST['userpw'];
           }
       }
       if(isset(
    $_SESSION['username']))
       {
       
    ?>
       <html>
          <head>
             <title>Geschützter Bereich</title>
          </head>
          <body>
              <p>Hier ist alles geschützt!</p>
          </body>
       </html>
    <?PHP
        
    }
    } else {
       echo 
    "Erst Anmelden: <a href=\"index.php\">Hier entlang</a>";
    }
    ?>
    ungetestet, sollte aber funktionieren!
    Geändert von Lime (30.11.11 um 20:28 Uhr)
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Sein Problem ist, dass er den $_POST['password'] nicht geprüft hat. Damit wurde ein leeres Passwort an die Datenbank übergeben. Dort bekommt er (hoffentlich) ein leeres Resultset zurück. Dann prüft er die Rückgabe von $row nicht sondern prüft eine nicht existente Property gegen ein leeres Passwort, was im Zweifelsfall true ergibt.

    Fazit: Man muss alle Fehlerquellen prüfen!
    Lime bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    OneTemplates OneTemplates ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Ort
    Bayern
    Beiträge
    4
    Hi,

    die Session beenden kannst du in dem du z.B. eine logout.php erstellst mit folgendem Inhalt:

    PHP-Code:
        if($_SESSION['signed_in'] == true) {
        
            
    $_SESSION['signed_in'] = NULL;
            
    $_SESSION['password'] = NULL;

            
    $_SESSION = array();
            
    session_destroy();

        
    mysql_close($datenbank); 
    Mfg
    Andy
     
    http://www.onetemplates.de/
    OneForum - Free Forum Solutions

  6. #6
    Avatar von Lime
    Lime Lime ist gerade online frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    373
    Oder du machst

    PHP-Code:
    unset($_SESSION['username']); 
    Gruß
     

  7. #7
    karton karton ist offline Grünschnabel
    Registriert seit
    Nov 2011
    Beiträge
    3
    Hallo zusammen!

    Vielen Dank für Eure Hilfe!
    Ich habe mein abgeändertes Script von saftmeister verwendet
    Dazu musste ich nur noch eine Variable ausbessern - hab lang dran herumgesucht - als Anfänger ist das eben nicht so leicht, sich auf Fehlersuche zu begeben. Bin aber irgendwie dahintergekommen, dass die if-Abfrage der Variable $password eigentlich §passwort lauten müsste und jetzt gehts.

    Danke nochmal an alle !


    PHP-Code:
    //$username = $_POST["username"];
    //$passwort = md5($_POST["password"]); Nur Passwortabfrage und ohne MD5
    $passwort = isset($_POST["password"]) ? mysql_real_escape_string($_POST['password']) : '';
     
    //if($password) Diese Variable hab ich umgeändert auf $passwort
    if($passwort

    {
      
    //$abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
      
    $abfrage "SELECT passwort FROM login WHERE passwort LIKE '$passwort' LIMIT 1"
     

  8. #8
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Upps! war gar nicht beabsichtigt. Aber gut, wenigstens hast du dabei was gelernt. Das ist der Grund, warum man error_reporting() beim testen auf die höchste verfügbare Stufe stellt. Warnungen einfach zu ignorieren kann nicht gut sein Wie im echten Leben :-D

    War jedenfalls keine Absicht, der Buchstaben-Dreher. Ich hoffe, meine Erklärung hat dir ein wenig weiter geholfen? Hilfe zur Selbsthilfe lautet meine Devise.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  9. #9
    karton karton ist offline Grünschnabel
    Registriert seit
    Nov 2011
    Beiträge
    3
    Ja absolut richtig. Ich bin auch der Meinung dass man am meisten lernt wenn man selbst herumbasteln muss. Fertige Scripts gibts ja zuhauf aber das ist nicht meins. Will ja verstehen was da passiert - zumindest ansatzweise

    Thanks!
     

Ähnliche Themen

  1. Loginscript
    Von Geordi im Forum PHP
    Antworten: 2
    Letzter Beitrag: 17.08.04, 17:25
  2. Loginscript
    Von server im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 02.03.04, 12:41
  3. loginscript
    Von bspainkf36 im Forum PHP
    Antworten: 5
    Letzter Beitrag: 12.02.04, 19:08
  4. Loginscript
    Von Memfis im Forum PHP
    Antworten: 8
    Letzter Beitrag: 12.07.03, 12:46
  5. Loginscript
    Von mX|steven im Forum PHP
    Antworten: 9
    Letzter Beitrag: 01.02.02, 18:18