2013-11-15 3 views
5

私はCakePHPのSecurityComponentを使用しています。そして、それはCSRFの攻撃からフォームを保存するので、非常に重要です。私のプロジェクトには合計10-12のフォームがあり、これが私の最初のCakePHPプロジェクトです。 SecurityComponentを有効にした後、私はちょっと困っていましたが、慎重な時間を取って取り除くことができました。これは私のプロジェクトの最後の形であり、すべてが正しいと思うが、依然としてフォームはブラックホールであると思う:(誰でも問題を教えてもらえますか?)CSRFのチェックや、SecurityComponentを無効にしたくありません。コード:要求はブラックホールドされました - 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> 

これは基本的に、各グループは、形態4つの又は5のラジオボタンとの合計40〜100基を有するMCQ試験の形態であるIは、CakePHP 2.4を使用している事前に感謝を

+0

javascriptを使用して非表示入力の値を変更することはできますか? – Nunser

+0

はい、あります。私はjQueryで4/5の隠しフィールドを変更しています。しかしそれは問題ですか? –

+1

おそらく、デバッグしましょう。シンプルなテキスト入力のために非表示のものを変更して、フォームを送信してみてください。それが提出すれば、それはあなたの問題です。私は説明と可能な解決策に答えます。もしそうでなければ、他に何ができるかを見なければならない。 – Nunser

答えて

9
。。。

コメントのとおり、フォームの隠し値を変更しているので問題が表示されます。SecurityComponentの仕組みはフィールドの名前を「ロック」しているため、悪意のある人は新しいフィールドを追加したり値を変更することができませんフォームが送信された後。しかしフィールド名がの値をロックするので、隠し値はさらに厳密です。ですから、jQueryでそれを変更することで、あなた自身のフォームをブラックホール化します。私はこのことを学んだ素晴らしい小さなポストがあります

look at itを取ります。著者は、この問題を回避する2つの方法についても説明しています。 1つは隠しフィールドのセキュリティを無効にするため、トークン用に計算されたハッシュにはこれらの値は含まれていません...実際には安全ではありません...
もう1つの解決策はFormHelperを変更して隠しフィールドを "ロック" 名前はですが、値はありません。私は、この例で使用するCakeのバージョンを覚えていませんが、そこに書かれているコードは現実的に同じでなければなりません。したがって、その解決策では、オプション配列を使用してフォームを厳しくしないように伝えることができます。

ああ、そこに与えられたその他のオプション(これは私が通常使用するものです)、普通の使用することです(私はちょうど私が私が自分で...まあいいことを把握思った...今はそれを読みます)非表示にするテキストフィールドを入力し、display:noneのようなCSSスタイルを追加します。

あなたの意見はあなた次第です。私はcssオプションが好きです。なぜなら、誰かが私のcssを邪魔にならないようにしていると(火かき棒などで)、隠されたフィールドの値を使っているだけかもしれません。それ以上の努力。とにかくそのフォーム提出を処理する場合は、追加の手順と検証をすべて行う必要があります。しかし、私が言ったように、あなたにはあなたの状況に最も適していると思います。既に投稿されたものに加えて

1

は、ここで問題を引き起こしている可能性がありますどのような何か他のものです:私の場合には、隠された入力は、それが上書き名前だ持っていました。結果

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

、最終$this->request->dataは、対応するキー$this->request->data['foo_bar']を有していました。 $this->request->data['ExampleModel']アレイ内にはありませんでした。これが問題の原因です。

問題を解決するには、テンプレートからnameキーを削除して、モデルのデータに入力を加え、その値を受け入れるようにコントローラを変更する必要がありました。

これは他の人に役立つことを願っています。

更新:これはどのモデルにも付属していないフォームでも機能します(例::

$this->Form->create(false, array(
    'url' => '/example', 
)): 
関連する問題