2013-11-15 19 views
5

Sto usando CakePHP's SecurityComponent. Ed è molto essenziale in quanto salva i moduli dagli attacchi CSRF. Il mio progetto ha un totale di 10-12 forme e questo è il mio primo progetto CakePHP. Dopo aver abilitato lo SecurityComponent ho avuto un po 'di problemi, ma ho potuto sbarazzarmi dopo alcuni minuti attenti. Questa è l'ultima forma del mio progetto e sembra che tutto sia corretto per me, ma la forma è ancora nera :(. Qualcuno può dirmi il problema? Non voglio disabilitare il controllo CSRF o SecurityComponent. Ecco la mia opinione codice:La richiesta è stata black-holed - CakePHP

<?php 
echo $this->Form->create('Record'); 
?> 
<script type="text/javascript"> var me = new MetroExam(); </script> 
<div class="exam_paper"> 
    <div class="question_box" id="q_b"> 
     <div class="q_n_a_header"> 
      <div class="instructions"> 
       <b>Instructions:</b><br> 
       <?=$inst['value_text']; ?> 
      </div> 
      <div id="timer">Please wait</div> 
     </div> 
     <div id="q_paper"> 
      <img id="q" style="display: none;" src="/oes/<?=$exam['path'].'?ts='.time(); ?>"> 

      <img id="loading_img" src="/oes/img/loading.gif"> 
     </div> 
    </div> 
    <div class="ans_box" id="a_b"> 
     <!-- information about answer paper. !important --> 
     <?php 
     $i = 0; 

     //these fields are essential for evaluating ans paper 
     echo $this->Form->hidden('submit', array('value' => 'true')); 
     echo $this->Form->hidden('start_time', array('value' => '')); 
     echo $this->Form->hidden('end_time', array('value' => '')); 
     echo $this->Form->hidden('duration', array('value' => '')); 
     echo $this->Form->hidden('valid', array('value' => '')); 
     echo $this->Form->hidden('passed', array('value' => '')); 

     //options for all radio 
     $options  = array(
      '1' => 'A', 
      '2' => 'B', 
      '3' => 'C', 
      '4' => 'D' 
     ); 
     if($exam['choices'] == 5){ 
      $options['5'] = 'None'; 
     } 

     $questions = (int)$exam['questions']; // 40 <= $exam['questions'] <= 100 
     $i = 1; 
     while($questions--){ 
      echo '<div class="'.(($i%2)==1?'each_answer_even':'each_answer_odd').'" id="ans-'.$i.'">'; 
      echo '<div class="q_number">'.($i <= 9 ? '0'.$i : $i).'</div>'; 
      $name  = 'ans'.str_pad($i, 3, '0', STR_PAD_LEFT); 
      $attributes = array('empty' => false, 'legend' => false, 'onclick' => 'me.answer_click('.$i.')'); 
      echo '<div class="mcq">'.$this->Form->radio($name, $options, $attributes).'</div>'; 
      echo '</div>'; 
      $i++; 
     } 
     echo $this->Form->end('Submit'); 
     ?> 
    </div> 
</div> 

Questa è sostanzialmente una forma esame DRM Dove ciascun gruppo ha 4 o 5 pulsanti radio e totale da 40 a 100 gruppi in una forma che sto utilizzando CakePHP 2.4 Grazie in anticipo

+0

stai per caso cambiando i valori degli ingressi nascosti con javascript? – Nunser

+0

Sì, sì. Sto cambiando 4/5 campi nascosti da jQuery. Ma è il problema? –

+1

Probabilmente, ma facciamo il debug. Prova a cambiare quelli nascosti per semplici input di testo e prova a inviare il modulo. Se invia, allora questo è il tuo problema e ti risponderò con la spiegazione e la possibile soluzione. Se no, allora dobbiamo vedere cos'altro può essere. – Nunser

risposta

9
....

Come per i commenti, il problema appare perché stai cambiando i valori nascosti del modulo. Il modo in cui funziona SecurityComponent è che "blocca" il nome dei campi, quindi un malfattore non può aggiungere nuovi campi o modificare i valori una volta inviato il modulo, Ma è ancora più rigido con i valori nascosti, perché blocca il nome del campo e il valore. Così, cambiandolo con jQuery, ti stai nascondendo la tua stessa forma.

C'è un piccolo post dove ho imparato questo, prendere uno look at it. L'autore spiega anche due modi per aggirare questo problema. Uno è di disabilitare la sicurezza per i campi nascosti, quindi l'hash calcolato per il token non include quei valori ... che non è veramente sicuro ...
E un'altra soluzione è modificare il FormHelper, e dirlo a "blocca" i campi nascosti nomi ma non i valori. Non ricordo quale versione di Cake l'autore utilizzi per l'esempio, ma il codice fornito dovrebbe essere praticamente lo stesso. Quindi con questa soluzione, puoi dire al modulo di non essere così severo con te con un array di opzioni.

Oh, e l'altra opzione data lì (questo è quello che uso normalmente) (Ho appena letto ora lì ... Ho pensato di capirlo da solo ... vabbè), è solo usare normale inserisci campi di testo per quelli che vuoi nascosti e aggiungi uno stile css come display:none.

Sta a voi decidere che cosa è meglio. Mi piace l'opzione css perché è più semplice, e in realtà, se qualcuno sta andando a fare casino con il mio css evily (con firebug o qualcosa di simile), potrebbe anche farlo con i valori dei campi nascosti, non richiede altro sforzo. Dovresti comunque fare tutti i passaggi e le verifiche supplementari quando gestisci l'invio di quel modulo. Ma come ho detto, fino a te che pensi sia meglio per la tua situazione.

1

Oltre a ciò che è già stato pubblicato, ecco qualcos'altro che potrebbe causare il problema: nel mio caso, un input nascosto aveva il suo nome sovrascritto.

$this->Form->create('ExampleModel'): 
$this->Form->input('foo_bar', array(
    'type' => 'hidden', 
    'name' => 'foo_bar', 
)); 

Come risultato, la finale $this->request->data aveva la corrispondente chiave $this->request->data['foo_bar']. Non era all'interno dell'array $this->request->data['ExampleModel'] e questo era il problema.

Per risolvere il problema, ho dovuto rimuovere la chiave name dal modello, facendo in modo che l'input appartenga ai dati del modello e quindi modificare il controller per accettare quel valore.

Spero che questo aiuti qualcun altro.

Aggiornamento: questo sarebbe anche lavorare su un modulo non collegato a qualsiasi modello, per esempio:

$this->Form->create(false, array(
    'url' => '/example', 
)): 
Problemi correlati