• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perでクイズを作っています。「戻る」対策を教えて)

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

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

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

  • ベストアンサー
  • 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で回答へ引き継ぐのは分かるのですが、もう一方の実現方法が分かりません。ファイルに書くのでしょうか? 素人で申し訳ありませんが、教えて下さい。