Klasse für Cookie-Validierung

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

  • Klasse für Cookie-Validierung

    Hi,

    ich habe mir eine Klasse gebastelt, die einen String per mcrypt verschlüsselt und in einem Cookie ablegt.
    Ich spiel gerade ein wenig mit mcrypt rum, hänge aber irgendwie in der Luft, da die Klasse mal funktioniert und mal wieder nicht...

    Ich habe folgende Klasse "class.CookieAuth.php" geschrieben:

    PHP-Code:
    class AuthCookie {
          
      
    // Handle für mcrypt
      
    private $td;
      
      
    // Verschlüsselungscode
      
    static $key 'Testkey';
      
      
    //mcrypt Informationen
      
    static $cypher MCRYPT_BLOWFISH;
      static 
    $mode MCRYPT_MODE_CFB;
     
      
    //Informationen zum Cookie  
      
    static $cookiename 'AUTH';
          
      public function 
    __construct(){
        
    $this->td mcrypt_module_open(self::$cypher,'',self::$mode,''); 
      }
      
        public function 
    set($challengekey){
          
    setcookie(self::$cookiename,$this->_encrypt($challengekey));
        }
        
        public function 
    validate($challengekey){
            
        if (!
    $_COOKIE[self::$cookiename] || $_COOKIE[self::$cookiename] == ""){
          echo(
    "Validate fehlgeschlagen, Cookiedaten nicht vorhanden!");
          }
        if (
    $this->_decrypt($_COOKIE[self::$cookiename]) != $challengekey){
            echo(
    "Validate fehlgeschlagen, User nicht berechtigt!");
          }

        }    
        
        private function 
    _encrypt($plaintext){        
          
    $iv mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_RAND);
          
    mcrypt_generic_init($this->tdself::$key,$iv);
          
    $crypttext mcrypt_generic($this->td,$plaintext);
          
    mcrypt_generic_deinit($this->td);
          return 
    $iv.$crypttext;
        }
        
        private function 
    _decrypt($crypttext){
          
    $ivsize mcrypt_enc_get_iv_size($this->td);
        
    $iv substr($crypttext,0,$ivsize);
          
    $crypttext substr($crypttext,$ivsize);
          
    mcrypt_generic_init($this->td,self::$key,$iv);
          
    $plaintext mdecrypt_generic($this->td,$crypttext);
          
    mcrypt_generic_deinit($this->td);
        return 
    $plaintext;
        }
        
        function 
    __destruct() {
        
    mcrypt_module_close($this->td);
      }

        
    //Class 

    Testweise habe ich eine Datei index.php' angelegt, um die Funktion der Klasse mal zu testen:

    PHP-Code:

    require_once("class.CookieAuth.php");

    //Ein zu verschlüsselnder Teststring
    $challengekey "XYZ";

    //Neues Objekt anlegen
    $obj_cookie = new AuthCookie();

    //Teststring verschlüsseln und in Cookie speichern
    $obj_cookie->set($challengekey);

    // Objekt löschen
    unset($obj_cookie);

    //++++++++++++++++++++++++++++++++++++++
    // Testvalidierung
    //++++++++++++++++++++++++++++++++++++++

    $obj_cookie = new AuthCookie();

    //Entschlüsseln und vergleichen
    $obj_cookie->validate($challengekey);

    unset(
    $obj_cookie); 
    Öffne ich die 'index.php' jetzt im Browser, wird keine Meldung ausgegeben. Lade die Seite aber mehrmals hintereinander neu, klappt die Validierung in unregelmäßigen Abständen nicht.
    Dann bekomme ich "Validate fehlgeschlagen, User nicht berechtigt!" ausgegeben, was bedeutet, dass der in der 'index.php' übergebene '$challengekey' nicht mit dem entschlüsselten String übereinstimmt.
    Wo habe ich einen Fehler in der Klasse? Hab irgendwie gerade einen Hänger und verstehe nicht, wieso es manchmal klappt und manchmal dann eben nicht?

    Gruß
    Oneside
    Luxus Magazin
    Luxus Shops

  • #2
    Lass zum Debuggen den Cookie-Kram weg, einfach nur $var == _decrypt(_encrypt($var) testen und in den Funktionen Testausgaben machen.

    Kommentar


    • #3
      Ok, danke für den Tipp, ich habe jetzt mal ohne Cookies Testausgaben gemacht und alles funktionierte wunderbar in der Methode "set()".
      Als nächstes habe ich die Methode "Validate()" geprüft und per Zufall den Fehler gefunden, der mich aber wirklich jetzt irgendwie total verwundert.

      In der Funktion Validate wird folgendes abgefragt:

      PHP-Code:
          public function validate($challengekey){
              
      *.........*

          if (
      $this->_decrypt($_COOKIE[self::$cookiename]) != $challengekey){
              echo(
      "Validate fehlgeschlagen, User nicht berechtigt!");
            }

          } 

      Wenn ich jetzt die If-Abfrage wie folgt umändere:


      PHP-Code:
          if (!$this->_decrypt($_COOKIE[self::$cookiename]) == $challengekey){
              echo(
      "Validate fehlgeschlagen, User nicht berechtigt!");
            } 
      Dann funktioniert alles ohne Fehler und ohne Probleme.
      Wie kann das denn bitte sein? ?
      Kann mich mal jemand aufklären?
      Luxus Magazin
      Luxus Shops

      Kommentar


      • #4
        Ich sehe gerade, dass der entschlüsselte String trotzdem manchmal falsch ist, aber die IF-Abfrage einfach nicht die Echo-Ausgabe macht, wenn der String nicht richtig entschlüsselt werden kann:

        PHP-Code:

            
        if (!$this->_decrypt($_COOKIE[self::$cookiename]) == $challengekey){
                echo(
        "Validate fehlgeschlagen, User nicht berechtigt!");
              } 
        Also wenn der entschlüsselte String NICHT GLEICH $challengekey ist müsste ja die echo-Ausgabe erzeugt werden, was aber mit dieser
        IF-Abfrage nicht passiert....
        Luxus Magazin
        Luxus Shops

        Kommentar


        • #5
          Dir ist aber schon klar, wo der fundamentale Unterschied darin liegt, ob du zwei Variablenwerte mit != vergleichst, oder ob du zuerst den Wert einer Variablen negierst, und dann auf Gleichheit mit dem Wert einer anderen Variablen abfragst ...?
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Ok, da fehlte wohl noch ne Klammer drum...

            PHP-Code:
            if (!($this->_decrypt($_COOKIE[self::$cookiename]) == $challengekey)){
                    echo(
            "Validate fehlgeschlagen, User nicht berechtigt!");
                  } 
            Wie wird das ohne die Klammer interpretiert?
            Wenn nicht "$this->_decrypt($_COOKIE[self::$cookiename])" und das dann zusätzlich nicht "== $challengekey" ?
            Luxus Magazin
            Luxus Shops

            Kommentar


            • #7
              Original geschrieben von oneside
              Wie wird das ohne die Klammer interpretiert?
              !$a == $b

              "Negiere" den Wert von $a, und vergleiche ihn dann mit $b.

              http://www.php.net/manual/de/languag...rs.logical.php
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                ... und die Negation eines Strings ergibt (meistens) false.

                Kommentar


                • #9
                  Ok, danke :-)

                  Trotzdem konnte ich mein Problem mit der Klasse leider noch nicht lösen :-(
                  Luxus Magazin
                  Luxus Shops

                  Kommentar

                  Lädt...
                  X