PHP4でアンケートフォームから送信されてきた値が正しいのかのチェック方法についての質問です。


ログインしているユーザに、アンケートフォームにランダムで質問一覧を表示し、各項目に対して良いか悪いかの評価を10段階でradioボタンで表示し、送信してもらいます。

しかし、現状ですと別の場所から表示されていない質問に対する評価をPOSTで送ることができてしまいます。なので、POSTで評価を受信した時に、ちゃんと表示されていた質問一覧と全て数とIDが一致すると確認してから、評価をDBに保存したいと考えています。

今の考えでは、表示した質問IDを全てセッション等保存して、送れれてきた質問IDと同じものが送れてきているのかチェックしようかと考えていますが、これでいいのでしょうか? 他に良い方法はありますでしょうか?


ちなみに、HTML_QuickFormを利用して、以下のようなコードを書いています。

PHP:
$radio["$question_id"][] = $form->createElement('radio', NULL, 'とても良い', null, 1);
を10回


HTML:
<input value="1" id="qf_xxxxxx" name="質問ID" type="radio">
を10回

このHTML_QuickFormが吐く idもうまく使えそうな気がするのですが…

回答の条件
  • 1人5回まで
  • 登録:2007/04/13 15:51:56
  • 終了:2007/04/20 15:55:03

回答(1件)

id:keisukefukuda No.1

keisukefukuda回答回数14ベストアンサー獲得回数02007/04/13 19:50:18

ポイント60pt

細かい状況がわからないですが、基本的には問題ないと思います。

しかし、セッションに単純に保存すると、ある一人のユーザーが複数の画面で質問ページを表示したときに破綻します。

ですから、複数表示を禁止するか、フォームを一回表示するごとにユニークなIDを割り振って、それをキーとして質問の一覧を保存する必要があるかと思われます。

あと老婆心ですが、質問文からお見受けするにCSRF脆弱性も残っていそうな気配を受けますので、調査して対策されるのがよいと思います。

  • id:p_question
    自己レスです。
    QuickFormのidが使えるわけないですね。javascriptの検証用ですよね、きっと。
  • id:kurukuru-neko

    PHPのセッションIDでの追加認証でも

    PHPのセッションIDより
    メッセージダイジェストに変換して
    値を作成してformのhiddenとして登録
    及び、セッション変数に保存して。
    POSTされたformから取り出した
    内容と再度サーバー側で同じ
    値になるか検証すれば何とかなるのでは。

    http://jp.php.net/manual/ja/ref.mhash.php
    http://jp.php.net/manual/ja/ref.hash.php
    http://jp.php.net/manual/ja/function.mt-srand.php

    http://jp.php.net/manual/ja/function.microtime.php

    http://www.okushin.co.jp/information/HTML_QForm/index.php

    ダイジェスト作成例

    <?php

    // HASHキー作成
    $msec = microtime(true);
    mt_srand( $msec );
    $mt_rand1 = mt_rand();
    $mt_rand2 = mt_rand();
    mt_srand();
    $mt_rand3 = 0;
    $mt_cycle=($msec % 10) + 1;
    for($i=0;$i<$mt_cycle;$i++) {
    $mt_rand3 += mt_rand();
    };
    $secret = pack("I*",$mt_rand1 ^ 0x01020408,$mt_rand2 ^ 0x10204080,$mt_rand3 ^ 0x01100220);

    printf("secret=%s\n",bin2hex($secret));

    // Session ID
    $sid = session_id();
    printf("session id=%s\n",$sid);

    // ダイジェスト化
    $form_sid = bin2hex(mhash(MHASH_SHA256,$sid,$secret));

    printf("sid=%s\n",$form_sid);

    // formに $form_sid をhiddenで埋め込む
    // セッション変数に $secretを保存
    ?>



この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません