2013-11-15 24 views
5

CakePHP'nin SecurityComponent kullanıyorum. Ve formları CSRF saldırılarından kurtardığı için çok önemlidir. Projemin toplam 10-12 formu var ve bu benim ilk CakePHP projem. SecurityComponent'u etkinleştirdikten sonra biraz sıkıntı çektim, ancak bazı dikkatli dakikalardan sonra kurtulabiliyordum. Bu benim projemin son şekli ve benim için her şey doğru görünüyor ama yine de formu siyah delinmiş gibi görünüyor :(Herkes bana problemi söyleyebilir miyim? CSRF kontrolünü veya SecurityComponent'u devre dışı bırakmak istemiyorum. kod:...İstek siyah delikli - 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> 

Bu temelde her grup I CakePHP'yi 2.4 peşin Teşekkür kullanıyorum bir formda 4 veya 5 radyo düğmeleri ve toplam 40 ila 100 grubuna sahip bir MCQ sınav şeklidir

+0

Gizli girdilerin değerlerini javascript ile değiştirerek herhangi bir şansın var mı? – Nunser

+0

Evet. JQuery tarafından 4/5 gizli alanları değiştiriyorum. Ama sorun mu bu? –

+1

Muhtemelen, ama hata ayıklayalım. Basit metin girişleri için gizli olanları değiştirmeyi deneyin ve formu göndermeyi deneyin. Eğer gönderirse, o zaman bu sizin probleminizdir ve açıklama ve olası çözümle cevaplayacağım. Eğer değilse, o zaman başka neler olduğunu görmeliyiz. – Nunser

cevap

9
.

Açıklamalara göre sorun, formun gizli değerlerini değiştirdiğinizden kaynaklanır.Güvenlik Bileşeninin çalışma şekli, alanların adını "kilitler", böylece bir kötücül yeni alanlar ekleyemez veya değerleri değiştiremez form gönderildikten sonra Ancak Ancak, gizli değerler ile daha da katı olduğundan, alan adı ve değerini kilitler. Böylece jQuery ile değiştirerek kendi formunuzu karartıyorsunuz.

Bunu öğrendiğim güzel bir küçük gönderi var, bir look at it. Yazar ayrıca, bu problemi atlamanın iki yolunu da açıklıyor. Biri gizli alanların güvenliğini devre dışı bırakmaktır, bu yüzden belirteci için hesaplanan karma, bu değerleri içermez ... bu gerçekten güvenli olmayan ...
Başka bir çözüm de FormHelper'ı değiştirmek ve Gizli alanları adları "kilitle", ancak değerleri değil. Yazarın yazarın hangi sürümünü kullandığını hatırlamıyorum, ancak verilen kod pratik olarak aynı olmalıdır. Bu çözümle, bir seçenek dizisiyle formun size bu kadar katı olmamasını söyleyebilirsin.

Oh, ve öteki seçeneği (normalde kullandığım şey) orada (Ben şimdi orada okudum ... Bunu kendi başıma buldum sanıyordum ... oh iyi), sadece normal kullanmak Gizlemek istediğinizler için metin alanları girin ve display:none gibi bir css stili ekleyin.

En iyi olduğunu düşündüğünüz şey size kalmıştır. Css seçeneğini beğenirim çünkü daha basittir, ve eğer birisi benim css'imle (firebug ya da bunun gibi bir şeyle) karışıklık yaratacaksa, bunu gizli alanların değerleri ile de yapabilirler. Daha fazla çaba. Yine de bu form gönderimini ele alırken tüm ek adımları ve doğrulamaları almalısınız. Ama dediğim gibi, size göre, sizin durumunuz için en uygun olduğunu düşünüyorsunuz.

1

Zaten yayınlanmış olana ek olarak, sorunlara neden olabilecek başka bir şey de var: Benim durumumda, gizli bir girdinin üzerine yazılmış. Bunun sonucunda

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

, nihai $this->request->data ilgili anahtar $this->request->data['foo_bar'] vardı. $this->request->data['ExampleModel'] dizisinde değildi ve sorun buydu.

Sorunu düzeltmek için, girdiden modelin verilerine ait olan name anahtarını kaldırmam gerekti ve sonra bu değeri kabul etmek için denetleyiciyi değiştirmem gerekiyordu. Umarım bu başka birine yardımcı olur.

Güncelleştirmesi10: Bu, herhangi bir modele bağlı olmayan bir formda da çalışır.:

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