导读:远程考试最怕的就是作弊防不住、考生闹纠纷。这篇文章拆解一套可落地的在线考试防作弊方案:切屏怎么检测、题库怎么乱序、计时怎么实现,外加异常行为怎么留痕,每步带代码要点与坑位提示。
在线考试防作弊通常分三层:环境层(浏览器能不能切走)、题目层(每个人看到的题是否相同)、时间层(倒计时是否公平可追溯)。三层都做到,配合留痕,就能覆盖绝大多数作弊场景。
切屏检测有两个信号:页面失去焦点(blur)和页面不可见(visibilitychange)。两者都要监听,因为切走浏览器标签、切到其他应用、弹窗抢占焦点,信号不同:
// 离开考试页面检测
window.addEventListener('blur', () => record('window-blur'));
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden') {
record('page-hidden');
}
});关键点是检测动作和计时分开:短时间失焦(比如误点)先警告,累计超过阈值(如 3 次或总时长超 30 秒)才判违规。别一失焦就交卷,考生会炸毛。
同卷同题是最容易被对答案的。乱序分两层:
// 选项乱序示例
function shuffleOptions(question) {
const options = question.options.map((opt, i) => ({ opt, i }));
for (let i = options.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[options[i], options[j]] = [options[j], options[i]];
}
return options.map(o => o.opt);
}乱序要在出卷时固定(用考生 ID 做随机种子),不要每次渲染都重排——考生刷新页面后选项又变,会引发纠纷。固定种子还能保证同一考生重进考试看到的卷子一致。
前端倒计时只是展示,真正的计时必须在服务端:
// 服务端记录开考时间,交卷时校验
if (now - examStartAt > durationMs + graceMs) {
return { code: "TIME_UP", answer: null };
}要点:①开考时间由服务端下发并落库;②交卷时服务端校验超时,超时部分不算分;③给 10-20 秒宽限期,防网络抖动误伤。前端倒计时与服务端时间要做校准(用服务端时间戳差值修正,不要用客户端时钟)。
每次切屏、每道题的作答时间都记日志,格式统一便于事后仲裁:
{ "ts": 1699999999, "type": "blur", "duration": 4, "questionId": "q12" }日志要只追加不覆盖,写入独立存储(如日志库或对象存储),供申诉时调取。留痕的目的不是实时拦截所有作弊,而是让"有没有作弊"有据可查。
在线考试按"前端监控+题库服务+计时器"三块做:前端负责采集切屏与作答事件,题库服务负责乱序与出卷,计时器独立校验超时。上线前重点演练三个场景:切屏触发判违规、断网重进续答、超时交卷边界。落地时建议把考试流程拆成"采集-出卷-计时"三层。同类分层在乔拓云教育系统的在线考试模块中有对应实现,异常行为用日志和申诉工单持续校验。
结语:在线考试防作弊的核心是"检测分级、乱序固定、服务端计时、全程留痕",四件事做扎实,公平性和可追溯性就都有了。本文与《企业网站日志不会看?访问日志分析与告警配置实战》同属企业数字化落地避坑系列,可对照阅读。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。