これはオンライン試験用です。ブラウザから戻るボタンと進むボタンを使用するようにユーザーをトラップし、ユーザーがすでに試験を受けているときにページを更新する必要があります。回答と回答を事前に感謝します。
1 に答える
クライアントが変更できるため、ソリューションがクライアント側のコードに依存するべきではないと思います。クライアントが開発者モードに入らないようにすることができる、ある種の制御された環境では問題ないと思います。
環境を制御できる場合は、キーボードショートカットを制限し、右クリックしてブラウザを全画面モードで提供するだけで、クライアントがタスクを正しく完了することができます。
それ以外の場合は、クライアントとサーバー間のキー/値トークンに依存するシステムがその役割を果たします。一部の安全なオンラインサービスはこのようなシステムに依存しており、ページの更新だけでなく「戻る」および「進む」機能を中断することに同意した場合にうまく機能します。クライアントがそのような壊れた機能を呼び出すとき、あなたは確かにコールバックをエミュレートすることができます。
ページを確実に表示するためにJavaScriptのみを使用すると便利な状況がいくつかあります。ランダムな識別子とランダムなページを生成してページが同じにならないようにするなど。
いずれにせよ(IMO)、セキュリティの目的でJavaScriptだけに依存することは(そして決して)良い考えではありません。
編集:
概念実証は次のとおりです。
サーバーはuniqidを生成し、クライアントはhtml5ローカルストレージ機能を使用してその値を保存します。ローカルストレージをキー/値レジストリとして使用して、ページステージを保存し、サーバーで新しく生成されたキーと比較して、保存されたキーと各リロードを比較できます。
これは非常に簡単で、サーバーで生成されたトークンとして使用されるものは多くのランダム化が可能であり、だれもそれを推測することはできません。
サーバーで生成されたトークンの長さが十分に長いと、クライアントのローカルストレージレジストリに適切な使い捨て暗号化キーを提供することもできます。
コード:
<?php
$stamp = uniqid();
?>
<!DOCTYPE html>
<html>
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://raw.github.com/andris9/jStorage/master/jstorage.js"></script>
<style>
body{background-color:blue;}
p{margin-left:auto;margin-right:auto;width:800px;background-color:gray;font-weight:bolder;padding:1em;}
</style>
<script>
// display nice messages
var err_reloaded_page = "page reloaded";
var keeper = '<?php echo $stamp; ?>';
var current = $.jStorage.get('state');
// first initialization, Exception
if(current == null){
$.jStorage.set('state',keeper);
current = $.jStorage.get('state');
}
if(current != keeper){
alert(err_reloaded_page);
}
</script>
</head>
<body>
<p>
Proof of concept<br/>
Can detect page reload by comparing a stamp created server-side, stored on the local storage and compared on each page reload.
</p>
</body>
</html>