Php 如何阻止某人返回上一页?

Php 如何阻止某人返回上一页?,php,mysql,session,Php,Mysql,Session,我正在开发一个“我的网站”,允许用户参加考试,这样他们就可以了解自己对某个特定主题的了解程度。不过我遇到了一个小问题。一旦用户提交了评分测试,我如何防止他们返回测试页面?我在Mac上运行Safari,当我提交测试后单击web浏览器中的“后退”按钮时,所有回答都会被填写。我希望它这样做:当用户提交测试并单击web浏览器中的后退按钮时,它会将他们重定向到主测试页面 我正在使用PHP和MYSQL。我甚至设置了测试页面,以便用户必须来自某个url(我使用的是HTTP_REFERER),我还尝试过其他东西

我正在开发一个“我的网站”,允许用户参加考试,这样他们就可以了解自己对某个特定主题的了解程度。不过我遇到了一个小问题。一旦用户提交了评分测试,我如何防止他们返回测试页面?我在Mac上运行Safari,当我提交测试后单击web浏览器中的“后退”按钮时,所有回答都会被填写。我希望它这样做:当用户提交测试并单击web浏览器中的后退按钮时,它会将他们重定向到主测试页面

我正在使用PHP和MYSQL。我甚至设置了测试页面,以便用户必须来自某个url(我使用的是HTTP_REFERER),我还尝试过其他东西,比如会话,但我似乎无法理解这一点。非常感谢您的帮助。

您不会阻止他们


相反,请更改您的应用程序,使其即使返回也能正常工作。您可以在页面的隐藏字段中嵌入一个唯一的数字,如果他们重新提交相同的测试两次,您可以检测到它并显示相应的错误消息。您还应该考虑如果他们修改唯一的数字会发生什么。

您可以运行javascript清除所有答案。您也可以只允许一次提交,以便后续提交不会得到处理。HTTP_REFERER通常是发送的,但是可以通过修改过的浏览器进行欺骗和伪造。

如果您不希望人们在回答后发布不同的答案,那么您只需在接受评分测试的脚本中检查用户以前从未提交过测试。如果您不这样做,聪明的学生总是能够通过直接向脚本发送适当的请求来绕过您的保护


如果你不想让人们“强”看到以前的答案<强>(例如,如果你有两个人在同一台计算机上对他们的测试进行评分),考虑在测试页面上使用Ajax来提交答案,然后从字段中删除它们。这样,大多数浏览器都不会记住答案,后退按钮也不会取消擦除被JavaScript擦除的数据

在成绩页面顶部,放置以下内容:

session_start();
$_SESSION['testcomplete'] = 'yes';
然后在测试的每一页顶部,写下:

session_start()
if ($_SESSION['testcomplete'] == 'yes') {
    header("Location:cheater.php");
}

您可以模拟没有可返回的页面。从一个页面开始,使用jQuery生成每个测试页面,并且不提供返回的方法,只提供前进的方法。“后退”按钮会在他们启动测试之前将他们带到页面,您可以允许他们再次启动测试并在应该的位置生成正确的部分。如果您在当前方式的开发中没有走得太远,那么这将非常容易。

您应该能够使用javascript完成此操作。

在脚本顶部发布答案,检查数据库中是否有当前用户的测试结果。如果是,请重定向到结果

if(get_test_results($user)){
   $test_url = get_test_url($user);
   header( "Location: $test_url" ) ;
}

禁用“后退”按钮不是一个好主意。

我自己在线考试时也遇到过类似的问题

我所做的是

  • 我提供了一个会话变量,如果用户将上一页的URL粘贴到地址栏中,那么在加载页面时,该页面将自动转发到下一个所需页面。提到其URL的页面是第一次访问还是再次访问由会话变量的值决定

  • 如果用户没有加载页面,而是通过浏览器按钮返回,则会自动重定向到历史记录中的下一页,如下所示:

javascript:window.history.forward(1);
希望这有帮助:)

可能重复的、等也可能与阅读相关。你还没有使用会话机制吗?地球上的每个浏览器都允许用户删除cookie。这是真的。它们都允许您禁用javascript。简言之:服务器端数据完整性永远无法通过客户端技术得到保证。对不起,为什么不在数据库中添加一个默认为0的列,然后在将其拉入页面后更新为1,这样您就只允许查询0值行?如果row=1,则打印警告…您可能会看到的另一件事是使用headers/meta标记来阻止页面缓存-使用header,例如可以从中检索更多信息