Php 如何使用Javascript捕获后退和前进按钮并刷新?

Php 如何使用Javascript捕获后退和前进按钮并刷新?,php,javascript,Php,Javascript,这是一个在线考试:我应该诱使用户使用浏览器中的后退和前进按钮,并在用户已经参加考试时刷新页面。 提前感谢您的回答和回复 我认为解决方案不应该依赖客户端代码,因为客户端可以修改它。我认为在某种受控环境中,可以防止客户端进入开发人员模式 在可以控制环境的情况下,限制键盘快捷键、右键单击并提供全屏模式的浏览器应足以确保客户端正确完成任务 否则,依赖于客户端和服务器之间的密钥/值令牌的系统应该执行此任务。一些安全的在线服务依赖于这样的系统,如果您接受中断“后退”和“前进”功能以及刷新页面,那么它工作得很

这是一个在线考试:我应该诱使用户使用浏览器中的后退和前进按钮,并在用户已经参加考试时刷新页面。
提前感谢您的回答和回复

我认为解决方案不应该依赖客户端代码,因为客户端可以修改它。我认为在某种受控环境中,可以防止客户端进入开发人员模式

在可以控制环境的情况下,限制键盘快捷键、右键单击并提供全屏模式的浏览器应足以确保客户端正确完成任务

否则,依赖于客户端和服务器之间的密钥/值令牌的系统应该执行此任务。一些安全的在线服务依赖于这样的系统,如果您接受中断“后退”和“前进”功能以及刷新页面,那么它工作得很好。当客户机调用这种中断的功能时,您当然可以模拟回调

在某些情况下,仅使用JavaScript来确保页面显示是有用的。例如生成随机标识符和随机标识符,使页面永远不相同等

在任何情况下(IMO),出于安全目的完全依赖JavaScript都不是(也永远不是)一个好主意

编辑:

以下是概念证明:

服务器生成uniqid,客户端使用html5本地存储功能存储该值。使用本地存储作为键/值注册表,我们可以存储页面阶段,并将每次重新加载与存储的键进行比较,然后与服务器新生成的键进行比较

这非常简单,用作服务器生成的令牌的内容可以随机化很多,防止任何人猜测它

一个足够长的服务器生成的令牌甚至可以为客户端本地存储注册表提供一个好的一次性加密密钥

代码:


正文{背景色:蓝色;}
p{左边距:自动;右边距:自动;宽度:800px;背景色:灰色;字体重量:粗体;填充:1em;}
//显示好消息
var err_reloated_page=“page reloated”;
var keeper='';
var current=$.jStorage.get('state');
//第一次初始化,异常
如果(当前==null){
$.jStorage.set('state',keeper);
当前=$.jStorage.get('state');
}
如果(当前!=管理员){
警报(错误重新加载页面);
}

概念证明
可以通过比较服务器端创建的、存储在本地存储器上并在每次页面重新加载时进行比较来检测页面重新加载。


我认为解决方案不应该依赖客户端代码,因为客户端可以修改它。我认为在某种受控环境中,可以防止客户端进入开发人员模式

在可以控制环境的情况下,限制键盘快捷键、右键单击并提供全屏模式的浏览器应足以确保客户端正确完成任务

否则,依赖于客户端和服务器之间的密钥/值令牌的系统应该执行此任务。一些安全的在线服务依赖于这样的系统,如果您接受中断“后退”和“前进”功能以及刷新页面,那么它工作得很好。当客户机调用这种中断的功能时,您当然可以模拟回调

在某些情况下,仅使用JavaScript来确保页面显示是有用的。例如生成随机标识符和随机标识符,使页面永远不相同等

在任何情况下(IMO),出于安全目的完全依赖JavaScript都不是(也永远不是)一个好主意

编辑:

以下是概念证明:

服务器生成uniqid,客户端使用html5本地存储功能存储该值。使用本地存储作为键/值注册表,我们可以存储页面阶段,并将每次重新加载与存储的键进行比较,然后与服务器新生成的键进行比较

这非常简单,用作服务器生成的令牌的内容可以随机化很多,防止任何人猜测它

一个足够长的服务器生成的令牌甚至可以为客户端本地存储注册表提供一个好的一次性加密密钥

代码:


正文{背景色:蓝色;}
p{左边距:自动;右边距:自动;宽度:800px;背景色:灰色;字体重量:粗体;填充:1em;}
//显示好消息
var err_reloated_page=“page reloated”;
var keeper='';
var current=$.jStorage.get('state');
//第一次初始化,异常
如果(当前==null){
$.jStorage.set('state',keeper);
当前=$.jStorage.get('state');
}
如果(当前!=管理员){
警报(错误重新加载页面);
}

概念证明
可以通过比较服务器端创建的、存储在本地存储器上并在每次页面重新加载时进行比较来检测页面重新加载。


我认为你不能,因为这是一个浏览器的东西,而不是代码的东西(我知道)。但是,查看锁定浏览器,我必须对其进行测试,它会完全锁定您的计算机,直到您退出为止。到目前为止,您发现了什么?为什么不直接使用
unload
event?(
或)是否有办法同时捕获“重试”按钮并重新发送?我已经尝试了这么多的代码,它的工作,但它都允许你再试一次,并重新发送..我已经解决了返回按钮的问题。。问题在于刷新页面。。你们能帮我吗?我不认为你们能,因为这是一个浏览器的事情,不是一个代码的事情(我知道)。然而,看看锁定浏览器,我不得不对它进行测试,它会完全锁定你的计算机,直到你退出
<?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>