这是针对在线考试的:我应该让用户使用浏览器的后退和前进按钮,并在用户已经参加考试时刷新页面。提前感谢您的回答和回复。
问问题
988 次
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 回答