Problem mit Loginscript

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Loginscript

    Guten Morgen,

    ich habe 1-2 Fragen zu einen Logonscript was ich bei mir einsetze. Ich werde erstmal kurz die Dateien posten:

    Das Script so funktioniert in Moment! Ich glaube sogar das stammt ursprünglich von hier...

    Das ist die login.php
    PHP-Code:
    <?php
    session_start
    ();
    include_once(
    '../config/login_funktionen.php');

    if ( isset(
    $_POST['login']) )
    {
        
    $userid check_user($_POST['nick'], $_POST['pw']);
        if (
    $userid!=false)
        {
            
    login($userid);

        
    $_SESSION["nickname"] = $_POST['nick'];
        
    $_SESSION["db_id"] = $userid;
        
    $_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
        }
        else
        {
        echo 
    "<script LANGUAGE=\"JavaScript\">";
        echo 
    "top.index.location.href='../index_01.php?pw=false'";
        echo 
    "</script>";
        }
    }

    if ( !
    logged_in() ) // Wenn nicht eingeloggt
    {
        echo 
    "<script LANGUAGE=\"JavaScript\">";
        echo 
    "top.index.location.href='../index_01.php?pw=false'";
        echo 
    "</script>";
    }
    else
    {
        echo 
    "<script LANGUAGE=\"JavaScript\">";
        echo 
    "top.index.location.href='../home.php'";
        echo 
    "</script>";
    }
    ?>
    Hier ist die session.php die jede Seite schützen soll:

    PHP-Code:
    <?php
    session_start
    ();
    include_once(
    'login_funktionen.php');

    if ( !
    logged_in() )
    {
        if (
    strstr($_SERVER['REQUEST_URI'], 'config') == true)//Prüfen ob sich der Server noch im Ordner "Config" befindet oder nicht
        
    {
        echo 
    "<script LANGUAGE=\"JavaScript\">";
        echo 
    "top.index.location.href='index_01.php?login=no'";
        echo 
    "</script>";
        exit;
        }
        else
        {
        echo 
    "<script LANGUAGE=\"JavaScript\">";
        echo 
    "top.index.location.href='index_01.php?login=no'";
        echo 
    "</script>";
        exit;
        }
    }
    else
    {
    $user_login $_SESSION["nickname"];
    $user_id $_SESSION["db_id"];
    }
    ?>
    Hier die logout.php

    PHP-Code:
    <?php
    session_start
    ();

    include_once(
    '../config/login_funktionen.php');

    if ( !
    logged_in() )
    {
    echo 
    "<script LANGUAGE=\"JavaScript\">";
    echo 
    "top.location.href='../'";
    echo 
    "</script>";
    }

    echo 
    "<script LANGUAGE=\"JavaScript\">";
    echo 
    "top.location.href='../'";
    echo 
    "</script>";

    logout();

    ?>
    Und zum schluss die wo die funktionen drin sind. login_funktionen.php
    PHP-Code:
    <?php
    function connect ()
    {
        
    $con mysql_connect('localhost''root''root') or exit(mysql_error());
        
    mysql_select_db('eventpage'$con) or exit(mysql_error());
    }

    function 
    check_user $name$pass )
    {
        
    // magic quotes anpassen
        
    if ( get_magic_quotes_gpc() ) {
            
    $name stripslashes($name);
            
    $pass stripslashes($pass);
        }
        
    // escapen von \x00, \n, \r, \, ', " und \x1a
        
    $name mysql_real_escape_string($name);
        
    // escapen von % und _
        
    $name str_replace('%''\%'$name);
        
    $name str_replace('_''\_'$name);

        
    $sql 'SELECT id FROM event_user_login WHERE nick = \'' $name '\' AND pw = \'' md5($pass) . '\'';
        if ( !
    $result mysql_query($sql) ) {
            exit(
    mysql_error());
        }
        if ( 
    mysql_num_rows($result) == ) {
            
    $user mysql_fetch_assoc($result);
            return ( 
    $user['id'] );
        } else {
            return ( 
    false );
        }
    }

    function 
    login $userid )
    {
        
    $sql 'UPDATE event_user_login SET UserSession = \'' session_id() . '\' WHERE id = ' . ((int)$userid);
        if ( !
    mysql_query($sql) ) {
            exit(
    mysql_error());
        }
    }

    function 
    logged_in ()
    {
        
    $sql 'SELECT id FROM event_user_login WHERE UserSession = \'' session_id() . '\'';
        if ( !
    $result mysql_query($sql) ) {
            exit(
    mysql_error());
        }
        return (
    mysql_num_rows($result) == 1);
    }

    function 
    logout ()
    {
        
    $sql 'UPDATE event_user_login SET UserSession = NULL WHERE UserSession = \'' session_id() . '\'';
        if ( 
    mysql_query($sql) ) {
            exit(
    mysql_error());
        }
    }

    connect();

    ?>


    So, jetzt habe ich das Problem, wenn man auf der Loginseite keine Daten oder falsche Daten eingibt dann erscheint nur die Logonseite nochmal. Es es sollte ja eigentlich "../index_01.php?pw=false" aufgerufen werden.

    Verstehe ich das richtig? Weil er bekommt doch von der Funktion check_user() den Wert "False" übermittelt.

    Habe auch schon mit einer Bedingung in der Funktion check_user() versucht den $name == "" zu prüfen.
    Wenn ja dann return ( false );
    Das nimmt er nicht.

    Zum anderen habe ich bei meinen alten Loginscript was sehr einfach war mittels der Session noch ein paar daten übermittelt

    $_SESSION["nickname"] = $_POST['nick'];
    $_SESSION["db_id"] = $userid;

    Somit konnte ich auf diese Werte von jeder Seite aus zugreifen. Möchte jetzt aber nicht so viel in die Session schreiben.

    Was gibt es auser GET noch für eine alternative die 2 Werte irgendwie mit in jede Seite zu übernehmen.

    Was haltet ihr von den Loginscript? Ich hatte vorher ein einfaches von: LINK


    Sorry für den vielen Text aber mache mir halt gedanken für ein schönes Loginscript!
    Danke schon einmal im vorraus für eure Antworten.


    Gruß,

    David

  • #2
    Also....:
    Wofür soll das Javascript gut sein?
    Ein Login auf JS Basis, neeee....

    Wozu speicherst du die SessionID in der DB?



    Möchte jetzt aber nicht so viel in die Session schreiben.
    Ja, nee, klar, ist logisch......
    Lieber die wichtigen Daten den unsicheren Weg über den Browser nehmen lassen.
    Wir werden alle sterben

    Kommentar


    • #3
      Wofür soll das Javascript gut sein?
      Damit leite ich die Seite nur wieder auf eine andere mehr nicht.
      Das ist auch nicht das Problem.

      Wozu speicherst du die SessionID in der DB?
      Habe ich so dem Script am Anfang entnommen. Sah mir sehr sich er aus bzw. ist es doch nicht schlimm die aktuelle SessionID mit der in der DB zu vergleichen oder?

      Ist das Script sicher bzw. reicht es aus?

      Kommentar


      • #4
        ist es doch nicht schlimm die aktuelle SessionID mit der in der DB zu vergleichen oder?
        Tja..
        Ich bin ja der Meinung, das ein regelmäßig eingesetztes session_regenerate_id() die SID Diebe in Zeitnot bringt. Das Verfahren kannst du dann natürlich knicken.

        Und die JS Weiterleitungen sind, nunja, überflüssig. Scheinbar funktioniert dein System nicht ohne. Das halte ich für recht übel.


        Warum nicht so, oder so ähnlich:

        PHP-Code:
        if(empty($_SESSION['userid']))
        {
           include 
        "dasWasJederSehenDarf.php";
        }else
        {
           include 
        "geschützterBereich.php";

        Zuletzt geändert von combie; 29.05.2008, 11:38.
        Wir werden alle sterben

        Kommentar


        • #5
          So, jetzt habe ich das Problem, wenn man auf der Loginseite keine Daten oder falsche Daten eingibt dann erscheint nur die Logonseite nochmal
          Also wenn du keine Daten angibst: Warum sollte ein false zurückkommen? Das gibt höchstens PHP Fehler weil du versuchst auf nicht definierte Vairablen zuzugreifen. Wenn du ein false haben willst dann musst du in diesem Fall zu Anfang der Funktion die Parameter prüfen z.B.
          PHP-Code:
          function check_user $name$pass )
          {
            if(!isset(
          $name) || !isset($pass)){
              return 
          false;
            }
          [...] 
          Und die folgende Zeile kann auch fehlerträchtig sein
          PHP-Code:
          if ($userid!=false
          Wenn die Funktion int 0 zurückgibt wird das dieser Vergleich als false auswertet! Verwende den !== resp === Operator wenn der Datentyp übereinstimmen MUSS.
          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

          Kommentar


          • #6
            Jo hast recht.
            Die Bedingung die du da hast hatte ich auch schon drin.

            Das mit dem Include probier ich mal ;-)

            Ok und die letzte Bedingung hast du recht.
            Ich sollte noch mit überprüfen das die ID != "" || !=0 ist
            Damit sollte das auch wege sein oder?

            Ich dachte es ist sicher wenn ich die Session nochmal mit der DB abgleiche.
            Deswegen habe ich das script genommen...

            Kommentar


            • #7
              Ich sollte noch mit überprüfen das die ID != "" || !=0 ist
              Also gemäss deiner Funktion kann die Rückgabe nur false oder ein Integer sein (id aus der DB). Ich würde das so prüfen
              PHP-Code:
              if($id !== false){
                
              //Rückgabe ist was anderes als false --> es wurde in der DB etwas gefunden 
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Ah ok, so hätte ich es garnicht gemacht.

                Sieht eigenartig aus.

                "!==" das vorallen! Ich werde es mal testen.
                Was ja auch nicht sein darf ist das eine 0 raus kommt.
                Das müsste ich ja auch noch abfangen!?!

                Kommentar


                • #9
                  Original geschrieben von jahlives
                  Wenn die Funktion int 0 zurückgibt wird das dieser Vergleich als false auswertet! Verwende den !== resp === Operator wenn der Datentyp übereinstimmen MUSS.
                  Warum sollte 0 eine gültige User-ID sein?

                  Original geschrieben von Picard_Jean-Luc
                  Was ja auch nicht sein darf ist das eine 0 raus kommt.
                  Ja, der Meinung bin ich auch!

                  Kommentar


                  • #10
                    Warum sollte 0 eine gültige User-ID sein?
                    Es ging mir hier mehr um's Allgemeine
                    Es ist imho einfach sauberer auch den Type zu prüfen, wenn eine Fkt etwas zurückgibt. In diesem Fall wird kein int 0 zurückkommen, aber der TS kann ja die Rückgabe irgendwann mal ändern.
                    @TS
                    z.B. dieser Code
                    PHP-Code:
                    $string 'Ich bin ein String';
                    $suche 'Ich';
                    $res strpos($string,$suche);
                    if(
                    $res != false){
                      echo 
                    '$suche in $string gefunden';
                    }else{
                      echo 
                    '$suche in $string nicht gefunden';

                    komischerweise wirst du IMMER ins else hineinkommen.
                    In deinem konkreten Fall ist das nicht tragisch, da ja keine 0 zurückkommen kann.
                    Aber für mich gehört das zum sauberen Programmieren, dass man den Typ einer Rückgabe ebenfalls vergleicht.

                    Gruss

                    tobi
                    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                    Kommentar


                    • #11
                      Ich danke euch für eure Antworten...werde nacher mal mein Script mit den ganzen Vorschlägen anpassen.

                      Hoffe das es dann ganz gut sein wird!

                      Vielen Danke!


                      Gruß,

                      Picard

                      Kommentar


                      • #12
                        Es ist imho einfach sauberer auch den Type zu prüfen, wenn eine Fkt etwas zurückgibt. In diesem Fall wird kein int 0 zurückkommen, aber der TS kann ja die Rückgabe irgendwann mal ändern.
                        Dann wird er sie aber hoffentlich nicht schlechter machen. Und falls doch, dann wäre die Prüfung auf != false ja sicherer.

                        Kommentar


                        • #13
                          Guten Abend,

                          ich wollte jetzt mein Logout Script verbessern:

                          Habe folgendes drin:
                          PHP-Code:
                          <?php
                          header
                          ("Location: ../");

                          session_start();
                          $tmp_sid session_id();
                          session_destroy();

                          include_once(
                          '../config/login_funktionen.php');

                          logout($tmp_sid);
                          ?>
                          Es funktioniert. Aber ich verstehe das nicht?
                          Eigentlich ist es doch so, sobald er auf das Header Location geht ist die Seite weg und der rest drunter sollte nicht abgearbeitet werden oder?

                          Hatte das Header Location nur zum Test oben mal rein geschrieben weil es woanders nicht funktioniert hatte.

                          Aber er macht das was ich will! Er geht nochmal in die Funktion und killt die Session.

                          Aber warum?

                          Kommentar


                          • #14
                            Ein LocationHeader beendet kein Script!
                            Wieso auch?

                            Nur:
                            Wenn der Client den Header versteht, dann landen die Ausgaben im Nirvana.
                            Wir werden alle sterben

                            Kommentar


                            • #15
                              Ok, also stimmt das script so?
                              Kann ich so lassen? Weil er macht was ich will...cool...*freu*

                              Kommentar

                              Lädt...
                              X