Perl言語を使ったクイズにおける「戻る」対策について

このQ&Aのポイント
  • Perl言語を使って作成したクイズにおいて、「戻る」をクリックされると正確な採点ができない問題が発生しています。
  • サーバー側に存在するPerlでのプログラムで正誤の計算を行い、「戻る」で計算を無効にする方法を教えてください。
  • クイズの入口はHTMLで記述されており、問題の表示や解答はPerlで制御されています。
回答を見る
  • ベストアンサー

Perでクイズを作っています。「戻る」対策を教えて

只今、Perl言語を使ってクイズを作っています。 問題を表示して、<INPUT TYPE=radio・・・>と言うとても簡単なものですが、1問毎に正解を表示させて、20問終了後に正解率を表示させています。 1問毎にPerlプログラムで正誤をカウントして正解率を計算しているのですが、「戻る」をクリックされると正解を再度選択できますので正確な採点にはなりません。 私には、サーバー側に存在するPerlでのプログラムで正誤の計算をしたものを「戻る」で、その計算が無かったことに出来る、言い換えれば「時間を戻す」ことが出来ること自体がとても不思議でたまりません!! 何故、そんなことが出来るのかも知りたいのですが、今回の質問は、Perl言語を使ったプログラムで「戻る」をクリックされたか否かを知る方法を教えて下さい。クイズの入口はhtmlで記述しているのですが、問題の表示、解答等はPerlで記述していますので、Perlプログラムの制御下の時のみ「戻る」を無効に出来ればその方法も教えて頂ければ大変助かります。 よろしく、お願い致します。

  • Perl
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.3

 保存の方法は、何だっていいです。ようするに、次に、サーバー側でCGIを起動した時に、参照できれば良いだけです。  テキストファイルに書くも良し。データベースに入れるも良し。perlだと、普通は、このあたりの2択かな。  空のファイルのファイル名で記録というのもありかもしれません(レコード管理が楽ちん。検索も削除も追加も全部ファイルシステムにお任せ=^・。・^=)。  レジストリに入れるという手も(普通はしません=^・・;=)    アプリケーションサーバーを利用してだと、もっと選択肢は豊富にありますけどね。

OK_OK_Wave
質問者

お礼

mitoneko様 返信を頂き、大変ありがとうございました。 素人の私に親切に説明をして頂き、感謝しています。 早速、プログラムを考えてみます。 ありがとうございました。

その他の回答 (2)

  • k_kota
  • ベストアンサー率19% (434/2186)
回答No.2

対策が全くないわけでは無いです。 ただ、この文章の内容だとperlを勉強してCGIの内容を理解してくださいとしか言えないです。 結局戻るを押したかどうかもhtmlの範疇では判別できません。 なので、perlで判別するのが一番です。となると内容理解する必要があります。

OK_OK_Wave
質問者

お礼

mitoneko様 返信を頂き、大変ありがとうございました。 素人の私に親切に説明をして頂き、感謝しています。 早速、プログラムを考えてみます。 ありがとうございました。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 webアプリケーションを作成していると、必ずぶつかる問題です。  不正な画面遷移とか、不正遷移対策とかなどなどのワードで検索すれば山のように記事が出てきます。どんな言語でアプリケーションを組むかによらない、httpの根源的な問題です。  これは、画面の遷移のコントーロールが基本的に、アプリケーションのコントロール下ではなく、ブラウザーのコントロールにより行われるのが原因です。    戻るのを統一的に「禁止」「阻止」する方法はありません。webアプリケーションには、ブラウザーの機能をコントロールするスベがないからです。javascriptを活用してある程度のブロックは出来ますが、それにしても、urlを手打ちして前のページに戻ることはどうやっても阻止することが出来ません。  ではどうするかですが、webアプリケーションの側で、画面がどのように遷移していったかを記録し管理していくしかありません。  有名な方法では、ワンタイムトークンの埋め込みでしょうか。  質問1→回答→質問2  の順でページが進んでいくとします。このページ群は、必ずこの順序で進む必要があります。たとえ、回答のページのurlを手打ちされたとしても無効にしなくてはなりません。  そこで、質問1のページに乱数を元に生成したIDをhiddenフィールドにでも格納しておきます。同時に、質問1で発行したIDとして、perl側でも記録をつけておきます。  回答欄を生成する際には、まず、hiddenフィールドを確認します。ついで、質問1のページのID記録と照合し、そのIDが存在するかどうかを確認します。存在すれば、このID記録を削除又は無効にします。その後、回答欄の生成処理を実行します。  もし、IDの照合が失敗したら、これは、何らかの不正な遷移です。トップページへ強制的に飛ばすも良し。エラーページを出すも良し。とにかくエラー処理をします。  この手順で、残りのページも全部制御します。  真ん中のページへいきなり飛んできても、サーバーにID記録がありませんから、エラーになります。戻るボタンで前のページに戻っても、すでに前のページのID記録は削除されていますから、やっぱりエラーになります。  唯一の穴は、hiddenフィールドを適当に作成してURLを手打ちでコールされた場合です。万が一、偶然IDが一致するとエラーにならなくなります。そのため、IDの値は、なるべく長い、かつ充分でたらめなコードを毎回生成するようにしてください。間違っても、推測できるようなものでは困ります。  他にも、セッションを利用するなど、いろいろな方法があります。最初に書いたような単語で検索を掛けてみると良いでしょう。

OK_OK_Wave
質問者

補足

mitoneko様 詳しく説明して頂き、大変ありがとうございます。私の勉強不足で「ワンタイムトークン」と言う言葉を始めて知りました。(お恥ずかしい限りです)。 教えて下さい!「質問1のページに乱数を元に生成したIDをhiddenフィールドにでも格納しておきます。同時に、質問1で発行したIDとして、perl側でも記録をつけておきます。」と有りますが、『perl側でも記録を付ける』とは具体的にどうすればいいのでしょうか? hiddenで回答へ引き継ぐのは分かるのですが、もう一方の実現方法が分かりません。ファイルに書くのでしょうか? 素人で申し訳ありませんが、教えて下さい。

関連するQ&A

  • クイズプログラムを作りたいのですが

    ホームページに三択クイズを載せたいのですが、問題を作り、間違えたらそこで終了という形式にしたいのですが、方法がわかりません。 また、結果(正答率)等の表示を行わず、代わりに全問正解のときのみ、指定のページに飛ぶというようなプログラムは作成可能でしょうか。 拙い文章で申し訳ありません。良い方法がありましたら教えて頂きたいです。 (大衆的なブラウザで利用できるものが良いです。言語は問いません。)

  • Flash lite1.0の計算クイズ

    初めまして。 初心者ですがモバイル版のFlash lite1.0で計算クイズを作成したいと思っています。 スタート画面でスタートを押すとクイズが始まり ランダムで問題が表示され、答えを数字ボタンで入力後 正解だと○不正解だと×と表示され また問題へ進んでいき、100問終了後 正解率とかかった時間をランキングに飛ばす と言う仕様で作成していきたいと思っているのですが 現在作成しているスクリプトではランダムはできているのですがクイズが9問までしかできません。 また、問題を表示できても答えを入力し、正解・不正解の表示をさせる方法がわかりません。 問題を100問作成する方法と答えを入力する方法を教えてください。(答えは二桁まで入力可能にしたいです) 説明がわかりづらいかもしれませんが 宜しくお願いします。

    • ベストアンサー
    • Flash
  • JavaScriptで簡単なクイズを作りたいんですが

    今HPを作っていて簡単なクイズを入れたいのですが JavaScriptを使ってしようと思ったのですが行き詰りました・・・ クイズの形式は問題をあらかじめ書いていて テキスト部分に答えを書いて ボタンをクリックすると「正解!」や「不正解!答えは○○」 と表示されるようなものです いろんなサイトを見たのですがよく理解できませんでした サンプルのソースなどを書いていただくとありがたいです 宜しくお願いします

  • 携帯のクイズについて

    携帯のクイズについて 携帯での4択クイズで10問を作っていましたが、1問のみのクイズにしました。 流れは以下の通りです。 問題インデックスから各問題へ移動 ↓ 4択クイズで、選択肢のどれかを選び、決定ボタンを押す ↓ 正解か、不正解がの表示と問題インデックスへ戻る為のアンカータグがある といった具合となっております。 不正行為を防ぐ為に、正解か、不正解がの表示の時点で携帯の戻るを押したら、 「不正な操作がありました」 という表示を入れたいのです。 なお、上記の処理は1つのファイルで処理しています。 どなたか、アドバイスをお願いします

    • 締切済み
    • PHP
  • クイズ番組で答えわかりますか?

    この前、たまたまテレビをつけるとサルヂエというクイズ番組がやっていてさっそく自分も紙とペンを用意してやってみたのですが・・・・・、結局1問もわからずに終わってしまいました(涙) その番組のクイズは事前に何人にもやってもらって正解率というのが最初に出るのですが、 司会者「つぎの問題は正解率70%」 自分「よっし!これならきっとオレにもできるぜ!」 って思ってもやっぱ全然わからないんです。。。本当にクイズ番組で答えがでるより先に答えがわかっちゃう人ってすごいと思います。僕もまだ若いし(高校生)、学力も平均ぐらいはあると思うのですが・・・ みなさんはクイズが解けるのでしょうか? また、クイズってコツとかないのでしょうか?

  • クイズ作成2:リンクした複数ページの中で、ファイル名に「○○」という文字列を含むファイルの数を検出

    昨日もこちらで質問させていただいたのですが、新たな課題が発生しましたので、再度質問させていただきました。何度も質問して申し訳ありませんが、もしよければアドバイスをいただけますようお願いいたします。 ○目的○ 10問のクイズを行い、最終画面に正解数を表すこと。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 現在、HTMLとJavaScriptを用いてクイズの作成を行っております。 具体的な流れを記述いたします。 10問のクイズ(1ページに1問)を順番に表示し、1問答えるごとに正否画面を表示する。 用いるファイルの名前は「クイズ1」「正解1」「残念1」というように、数字が「1から10」まで変動するだけです。 クイズ1  ↓ 正解1 (or 残念1)  ↓ クイズ2  ↓ 正解2 (or 残念2)  ↓ クイズ3  ↓  :  ↓ クイズ10  ↓ 正解10 (or 残念10)  ↓ 最終画面 上のような流れで、「最終画面」で正解数の合計を表示したいと思っているのですが、具体的にどのようなプログラムを組んだらいいのか悩んでおります。 現在の私の考えとしましては、最終画面に達するまでに、「正解」という文字列を含むファイルにリンクした「数」をカウントすればいいのではないか、と思っています。 よかったらアドバイスをいただけますようお願い申し上げます。

  • エクセルでクイズの表示

    簡単なクイズ表示方法を探しています。 考えた方法。 エクセルをデータベース。A列に問題。B列に回答。 例えばパワーポイントの白紙画面に問題を表示。 その画面をクリックしたり、スペースキーを押すなどすると答えを表示。 終わったら次の問題へ。 という流れです。 できればエクセルデータベースの行は、ランダムで出題できると嬉しいです。 正誤の判断をPCにやらせないので、簡単にできそうな気がするのです。 なにぶんオフィス系ソフトに弱いので教えてください。

  • 正誤プログラムを作成しています.

    こんにちは!皆様.少しわからないことがありメールさせて頂きました. 私は大学で心理実験で用いるプログラムをC言語にて作成しています. プログラムのフローは (1)4桁の乱数を発生させる. (2)その乱数に正答を被験者に入力させる. ※その正答に関しては4桁以上でも構わないのです. (3)その回答時間を測定する. (4)また回答率も表示させる. 困っているのは(2)の箇所のプログラムで, まず回答者からdouble型で回答(15桁以内)を受け取り, それの桁数をカウントします. それから回答を一桁ごとに配列に代入していきます. そして,各桁を正誤させようかと思っています. 問題なのは,桁数をカウントするとカウントした数値がnullになってしまいます. 後,正誤させるのにどのようなプログラムを使ったら宜しいでしょか? お教えください.宜しくお願いします.

  • クイズヘキサゴン

    偶然見ていたクイズヘキサゴンでコーナー名は分かりませんが 6人ぐらいんの人が小学校六年生の分数の問題で 鶴野さんが 108÷9=12×4=48という計算をしていて正解になりましたが、 これは合っているんでしょうか? 私にはあっているように思えないんですが。

  • 4択クイズの解答について悩んでいます(涙)

    現在私はVB2005で4択のクイズ形式のプログラムを作成しています。 目標は「300問の問題を作成しそのなかからランダムに100問を出題し全問回答を終えたらその結果を表示する」というものを作ることです。 データセットに問題、解答群などを格納しています。 それをフォームで表示してラジオボタンで4択のなかから正解と思うものを1つ選びボタンをクリックして次の問題へ移行する・・・というような流れのプログラムです。 今壁にぶつかっているのが「問題一つ一つの回答をどのように保持し、どのように結果表示すればいいのか」というところなのです。 当方VBは初心者でなかなか前に進めず悩んでいます。 知恵をかしてください。どうかよろしくお願いしますm(_ _)m