0

これはオンライン試験用です。ブラウザから戻るボタンと進むボタンを使用するようにユーザーをトラップし、ユーザーがすでに試験を受けているときにページを更新する必要があります。回答と回答を事前に感謝します。

4

1 に答える 1

3

クライアントが変更できるため、ソリューションがクライアント側のコードに依存するべきではないと思います。クライアントが開発者モードに入らないようにすることができる、ある種の制御された環境では問題ないと思います。

環境を制御できる場合は、キーボードショートカットを制限し、右クリックしてブラウザを全画面モードで提供するだけで、クライアントがタスクを正しく完了することができます。

それ以外の場合は、クライアントとサーバー間のキー/値トークンに依存するシステムがその役割を果たします。一部の安全なオンラインサービスはこのようなシステムに依存しており、ページの更新だけでなく「戻る」および「進む」機能を中断することに同意した場合にうまく機能します。クライアントがそのような壊れた機能を呼び出すとき、あなたは確かにコールバックをエミュレートすることができます。

ページを確実に表示するために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>
于 2012-12-17T02:55:02.017 に答える