Vyplnění hesel ve formuláři po neúspěšné PHP validaci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
MartyIX
Člen | 217
+
0
-

Mám velice jednoduchý formulář a funkce nickValidator mi zjistí, zda je daná přezdívka používaná či ne. Problém nastane když uživatel odešle formulář (vše má vyplněné správně) a přezdívka není volná, pak se nastaví výchozí hodnoty u všech prvků formuláře správně a jen u hesel se nevyplní nic. Možná je to nerozumné ale i tak bych rád kdyby v takovém případě uživatel pouze změnil přezdívku a mohl kliknout na submit a nemusel znovu zadávat heslo. Jak toho docílit?

protected function createComponentSignInForm()
{
  $this->form = new AppForm;
  $form = $this->form;

  $form->addText('nick', 'Username:')
    ->addRule(Form::FILLED, 'Please fill the username field.')
    ->addRule(array($this, 'nickValidator'), 'The username was chosen by another user.')
    ->getControlPrototype()->class('required');
  $form->addPassword('pass', 'Password:')
    ->addRule(Form::FILLED, 'Please fill the password field.')
    ->addRule(Form::MIN_LENGTH, 'The password is too short. Minimal length is %d characters.', 5)
    ->getControlPrototype()->class('required');
  $form->addPassword('pass2', 'Re-type password:')
    ->addRule(Form::FILLED, 'Re-type your password again.')
    ->addRule(Form::EQUAL, 'Passwords are not the same.', $form['pass'])
    ->getControlPrototype()->class('required');
  $form->addSubmit('ok', 'Send')
      ->onClick[] = array($this, 'okClicked');
  $form->addSubmit('cancel', 'Cancel')
      ->setValidationScope(FALSE) // prvek se nebude validovat
      ->onClick[] = array($this, 'cancelClicked');

  return $form;
}
redhead
Člen | 1313
+
0
-

Toto je bezpečnostní řešení a není to chyba, už vůbec ne v Nette, ale obecně. Na všech stránkách to takhle funguje a neznám jedinou, kde by heslo mohlo být předvyplněno. Jediným řešením je kontrolovat username ajaxově během vyplňování formuláře a neodesílat kvůli tomu formulář a načítat znovu stránku.

despiq
Člen | 320
+
0
-

nebo muzes vytvorit bezpecnostni diru a nechat password jako type text
a to je samozrejme ta nejhorsi mozna cesta kterou zadnej rozumnej clovek nepujde

Foowie
Člen | 269
+
0
-

… nebo pomocí hidden pole si udělat úložiště a před/po requestu to pomocí JS do password fieldu uložit/načíst

Ale jako nejrozumnější mi příjde, jak psal redhead, ajaxová kontrola username.

Editoval Foowie (11. 4. 2010 12:50)

MartyIX
Člen | 217
+
0
-

redhead: Foowie: Ajax mam v planu. Vim, ze po jeho pouziti bude ten problem jen okrajovym pripadem, ale stejne me to zajimalo ;-)

despiq: type=text pouzit nechci, to je moc brutalni :)