Empfehlungen: Erweiterte Suche

Problem mit Passwort Validierung ( validate password )

Datenbankobjekte strukturieren und validieren

Problem mit Passwort Validierung ( validate password )

Beitragvon mbrod » Do 31. Dez 2009, 12:37

Im Model User habe ich folgende Validierungen:
Code: Alles auswählen
    var $validate = array(
        'username' => array(
            'isUnique'=>array(
                'rule' => 'isUnique',
                'message' => 'This username has already been taken'
            ),
            'notempty'=>array(
                'rule'=>'notEmpty',
                'message' => 'This field cannot be left blank'
            ),
            'forbidden'=>array(
                'rule'=>'forbiddenUsername',
                'message'=>'This is a reserved username'
            )
        ),
        'password'=>array(
            'minLength'=>array(
                'rule'=>array('minLength', 6),
                'message' => 'Password must be at least 6 characters long.'
            )
        ),
        'email' => array(
            'rule' => array('email', true),
            'message' => 'Please supply a valid email address.'
        )
    );
 

Sofern der Benutzer bei der Registrierung alles richtig macht, funktioniert dies auch.
Probleme gibt es, falls die Validierung fehlschlägt, und der Benutzer seine Angaben korrigieren muss. (Siehe Bildschirmfoto: Benutzer hat überhaupt keine Angaben gemacht, nur "Register" geklickt.)
Bild 1.jpg
Bild 1.jpg (30.55 KiB) 684-mal betrachtet

Da das Passwort vor der Validierung gehasht wird, ist dies sogar ein valides Passwort, denn es ist 40 Zeichen lang, obwohl der Benutzer gar kein Zeichen eingegeben hat. Zur Info noch $this->data:
Code: Alles auswählen
Array
(
    [User] => Array
        (
            [username] =>
            [password] => 6315bec5950d0a78ff939b72abb2654a1cf043d5
            [email] =>
        )

)


Im View kann man behelfsweise die Rückgabe des gehashten Passworts mit value="" unterdrücken. Es hilft aber nicht wirklich weiter, da vor der Validierung dieses "nichts" wieder ein 40 Zeichen breites Wort ergibt.
Hat jemand dieses Problem schon mal gelöst?
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Problem mit Passwort Validierung ( validate password )

Beitragvon Mathias » Do 31. Dez 2009, 16:41

Bist du dir sicher, dass ein leeres Passwortfeld gehasht wird?
Lasse ich 'nichts' hashen, kommt bei mir ein anderer Wert raus. Egal, ob sha1 oder MD5.
Lässt du vom Browser irgendwelche Felder automatisch ausfüllen oder hast du mal Formulardaten auf dieser über den Browser gespeichert?
Aber soweit ich weiß, erkennt Cake, dass das Feld beim POST leer war. Du könntest ja das Passwort auch noch _vorher_ auf empty checken.

Nur mal ein paar schnelle Gedanken im alten Jahr ;)
Guten Rutsch
cheers
Benutzeravatar
Mathias
 
Beiträge: 225
Registriert: Mi 4. Jun 2008, 22:30
Wohnort: Berlin
CakePHP-Version: 1.3.x
OS: OS X 10.6.x

Re: Problem mit Passwort Validierung ( validate password )

Beitragvon mbrod » Do 31. Dez 2009, 18:54

Also, mein Browser (Firefox 3.0.16 MacOS) tut da nichts automatisch rein. Das Bildschirmfoto zeigt das, was Cake in das Feld zurückgibt. Wenn im View value="" steht, ist auch im Browser das Passwortfeld leer. Ich habe dies nur mal gezeigt, um das Problem zu verdeutlichen.

Danke schon mal soweit, und Prost Neujahr!
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

gelöst: Problem mit Passwort Validierung ( validate password

Beitragvon mbrod » Fr 1. Jan 2010, 22:28

Inzwischen ist mir klar geworden, das die Auth-Component und Validierung eines 'password' genannten Feldes nicht ohne weiteres funktionieren. Grund ist - wie schon oben erwähnt -, dass das Passwort durch die Auth-Component automatisch unter Hinzufügung des Security.salt gehasht wird. Einen Workaround habe ich in einem anderen Forum gefunden.

Beschreibung: Im Register-View wird statt 'password' ein anderes Feld z.B. 'secret' verwendet. Die Eingaben in dieses Feld werden validiert, wobei das 'secret' Feld nicht in der Datenbank stehen muss. Bei der Validierung ist aber 'on'=>'create' hinzuzufügen. Wichtig ist, im Controller die Validierung vor $this->User->save() auszuführen und, wenn die Validierung erfolgreich verläuft, den Wert aus dem secret-Feld zu hashen und in das Passwortfeld zu kopieren.

register.ctp:
Code: Alles auswählen
echo $form->create('User', array('action'=>'register'));
echo $form->input('username');
echo $form->input('secret',array('type'=>'password','label'=>__('Password',true)));
echo $form->input('email');
echo $form->end(__('Register',true));
 

Model user.php
Code: Alles auswählen
    var $validate = array(
        'username' => array(
            'isUnique'=>array(
                'rule' => 'isUnique',
                'message' => 'This username has already been taken'
            ),
            'notempty'=>array(
                'rule'=>'notEmpty',
                'message' => 'This field cannot be left blank'
            ),
            'forbidden'=>array(
                'rule'=>'forbiddenUsername',
                'message'=>'This is a reserved username'
            )
        ),
        'secret'=>array(
            'minLength'=>array(
                'on'=>'create',
                'rule'=>array('minLength', 6),
                'message' => 'Password must be at least 6 characters long.'
            )
        ),
        'email' => array(
            'rule' => array('email'),
            'message' => 'Please supply a valid email address.'
        )
    );
 

users_controller.php:
Code: Alles auswählen
    function register() {
        if (!empty($this->data)) {
            $this->User->create();
            //Avoid intrusion
            if(!empty($this->data['User']['group'])){$this->data['User']['group']=0;}
            // Check for data validation
            $this->User->set( $this->data );
            if($this->User->validates()){
                // Hash the password, and save the new record
                $this->data['User']['password'] = $this->Auth->password($this->data['User']['secret']);
                $this->User->set( $this->data );
                if ($this->User->save($this->data)) {
                    $this->Session->setFlash(__('The User has been saved', true));
                    $this->Auth->login($this->data);
                }
                else {
                    $this->Session->setFlash(__('The User could not be saved. Please, try again.', true));
                }
            }
        }
    }
 
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Problem mit Passwort Validierung ( validate password )

Beitragvon Mathias » Sa 2. Jan 2010, 00:08

Man kann es sogar in diesem Forum finden ;) Ich bin davon augegangen, dass du vorher schon mal im Forum geschaut hast. Aber viele Wege führen ja bekanntlich nach Rom ;)

Thema: controller/beim-update-das-passwordfeld-in-ruhe-lassen-t311.html

Relevante Posts:
Frohes Neues
cheers
Benutzeravatar
Mathias
 
Beiträge: 225
Registriert: Mi 4. Jun 2008, 22:30
Wohnort: Berlin
CakePHP-Version: 1.3.x
OS: OS X 10.6.x

Re: Problem mit Passwort Validierung ( validate password )

Beitragvon mbrod » Sa 2. Jan 2010, 09:11

Ja richtig, das Thema beinhaltet in der Tat auch die Lösung für mein Problem. Hatte es auch kurz angelesen. Durch das Thema "Passwort in Ruhe lassen" und "update" kam ich aber nicht auf die Idee, dass dort die Lösung für mein "Registrierungs" Problem zu finden ist.
So haben wir hier im Forum jedenfalls diese Problematik aus unterschiedlichen Blickwinkeln aus behandelt. :)
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Problem mit Passwort Validierung ( validate password )

Beitragvon euromark » Fr 22. Jul 2011, 01:22

euromark
 
Beiträge: 618
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.1
OS: Windows


Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron