Wenn ich ein Eintrag in der Datenbank machen will, sagen wir eine
Registratur für einen Benutzer dann habe ich ein Formular mit z.B.
Kontaktdaten und natürlich das zukünftige Password. Wenn ich jetzt ein
böser Webuser bin und einfach ein input wie data[MODEL][id] noch im
Quelltext einfüge und die seite einfach auf meinem Pc speichere, dann
das manipulierte Formular abschicke wird komischerweise NICHT ein
Eintrag in der Datenbank hinzugefügt sondern der Eintrag mit der
zusätzlich eingefügten id geupdated trotz das ich mit Model::create()
vorher ein Hinzufügen ankündige. Damit könnte jemand das Password
eines Admins überschreiben :/ Mein Quelltext sieht ca so aus:

        function register()
        {
                $this->pageTitle = l('user_register');

                if ( !empty($this->data) )
                {
                        $this->User->data = $this->data;
                        $validate = $this->User->validates();
                        $userExists = 
$this->User->userExists($this->data['User']
['username']);

                        if ( !$userExists && $validate )
                        {

                                $this->data['User']['password'] = 
md5($this->data['User']
['password']);
                                $this->data['User']['created'] = time();
                                $this->data['User']['last_login'] = '0';
                                $this->data['User']['active'] = '0';
                                $this->data['User']['activationkey'] =
Security::generateAuthKey();
                                $this->User->create($this->data);

                                if ( $this->User->save($this->data, false, 
array('username',
'password', 'created', 'last_login', 'active', 'activationkey')) )
                                {
                                        $this->Session->setFlash( 
l('user_success_registration') );
                                        
$this->redirect(array('action'=>'login'), null, true);
                                }
                                else
                                {
                                        $this->Session->setFlash( l('error') );
                                }
                        }
                        else
                        {
                                $this->Session->setFlash( l('error') );

                                if ( $userExists )
                                {
                                        $this->User->invalidate('username', 
l('error_user_nameexists') );
                                }
                        }
                }
        }

Jetzt frag ich mich aber warum wird trotz dem create bei Model::save
mit "$this->set($data);" eine ID gesetzt obwohl ich ein create
angekündigt habe. Bei dem set wird nämlich die ID durch dies wieder
gesetzt:

if ($x === $this->primaryKey) {
        $this->id = $y;
}


Ich habe daher mich auch mit einer Whitelist versucht, aber dies
überprüft nur den input von $this->data und nicht $this->id. Es
scheint mir jedenfalls so, als wäre das ein schwerwiegender Bug, ich
lass mich aber auch gerne aufklären weil ich nicht immer unset($this-
>data['User']['id']); in einem add benutzen will.

Gute Nacht,

bye Hajo


--~--~---------~--~----~------------~-------~--~----~
Sie erhalten diese Nachricht, weil Sie Mitglied sind von Google Groups-Gruppe 
"CakePHP-de für deutsche CakePHP Entwickler".
 Für das Erstellen von Beiträgen in dieser Gruppe senden Sie eine E-Mail
an [email protected]
 Um sich von dieser Gruppe abzumelden, senden Sie eine E-Mail an [EMAIL 
PROTECTED]
 Weitere Optionen finden Sie in dieser Gruppe unter 
http://groups.google.com/group/cakephp-de?hl=de
-~----------~----~----~----~------~----~------~--~---

Antwort per Email an