2011-01-13 8 views
5

Sto seguendo questo esempio esercitazionePerché questo esempio Zend smette di funzionare quando aggiungo un hash alla forma

codice di progetto: http://akrabat.com/wp-content/uploads/zf-tutorial-layoutform.zip

tutorial: http://akrabat.com/zend-framework/a-form-in-your-layout/

Il codice del progetto viene eseguito come previsto, fino a quando non aggiungo un elemento hash al modulo. Tutto ciò che faccio è aggiungere questo codice nel modulo sotto application/forme/Signup.php

$hash = new Zend_Form_Element_Hash('hash'); 
$hash->setSalt('mysalt'); 
$this->addElement($hash); 

Questo extra po 'di codice genera tutto fuori. Quando invio il modulo ora, mi dà l'errore che i 2 token non corrispondono.

Alcuni di risoluzione dei problemi:

  • Il problema non è l'hash per sé, perché funziona bene in altri miei esempi.
  • Penso che abbia a che fare con il modo in cui viene gestita la richiesta in questo esempio, ma non sono sicuro di quale sia esattamente il problema. Ho pensato che avesse a che fare con il numero di hop, ma quando modifico Zend_Form_Element_Hash e ho cambiato il numero di hop da 1 a 100, ho ancora lo stesso errore.

Questa è la misura della risoluzione dei problemi che potrei pensare al mio livello di esperienza con Zend. Quindi pensavo fosse ora di chiedere il cervello grande. Spero che qualcuno possa capirlo.

+0

Poiché l'elemento hash utilizza zend_session potrebbe essere un problema. un'altra cosa da controllare potrebbe essere l'hop fino alla convalida quando l'hash scade dopo un salto (o dopo un timeout). – Fge

+0

No è ​​hardcoded. Ma potresti voler confrontare il contenuto della sessione e i dati del modulo inviato. ($ _SESSION vs $ _POST) e rimuovere eventuali reindirizzamenti per il debug. – Fge

+0

Non direttamente. Ma è più di uno se la tua barra del browser mostra qualcos'altro rispetto ai moduli target. Ma se non si effettua il reindirizzamento, è necessario controllare il $ _SESSION/$ _ POST. – Fge

risposta

2

Funziona anche dopo aver aggiunto l'elemento hash al modulo? In tal caso, potresti caricare il tuo progetto e postare come risposta separata.

Tutto quello che ho fatto è stato aggiungere il codice che hai postato e ha funzionato bene. Dove stai usando questo codice? Sembra qualcosa a che fare con il tuo ambiente?

0

Da: Zend_Form_Element_Hash

Questo elemento assicura la protezione da attacchi CSRF sulle forme, garantendo i dati sono presentata dal sessione utente che ha generato la forma e non da uno script canaglia. La protezione si ottiene aggiungendo un elemento hash a un modulo e verificandolo quando viene inviato il modulo.

Il nome dell'elemento hash deve essere univoco. Si consiglia di utilizzare l'opzione di sale per le elemento-due hash con stessi nomi e diversi sali non sarebbe collidere:

$form->addElement('hash', 'no_csrf_foo', array('salt' => 'unique'));

È possibile impostare il sale in seguito utilizzando il setSalt ($ sale) metodo.

Internamente, l'elemento memorizza un identificatore univoco tramite Zend_Session_Namespace e lo controlla al momento dell'invio (controllando che TTL non sia scaduto). Il validatore 'Identico' viene quindi utilizzato per garantire che l'hash inviato corrisponda all'hash memorizzato.

L'helper della vista 'formHidden' viene utilizzato per rendere l'elemento nel modulo.

cercherò:

$form->addElement('hash', 'unique_form_name', array('salt' => 'unique_salt'));

Non vedo unico nome del modulo/hash nel codice e questo è il motivo per cui i token non mach.

+0

Non è la stringa 'hash' che viene utilizzata per creare l'elemento come nome univoco? –

+0

Il nome non è il problema. Funziona bene con il nome "hash". – user570783

Problemi correlati