问题 注销后防止后退按钮


我不希望用户在注销后单击后退按钮返回到安全页面。在我的注销代码中,我取消了会话并重定向到登录页面。但是,我认为浏览器正在缓存页面,因此尽管会话从注销中被销毁,它仍然可见。

我可以通过不允许浏览器缓存来避免这种情况

header("Cache-Control", "no-cache, no-store, must-revalidate")

但这样我就失去了浏览器缓存的优势。

请建议一个更好的方法来实现这一目标。我觉得,必须有一种方法来处理这个由javascript客户端


12673
2018-05-09 07:48


起源

您不必禁用任何内容。如果他们返回,他们将被提供受限制页面的缓存版本。如果他们试图点击它,没有任何东西可以工作,因为不会设置适当的会话。 - N.B.
@ N.B。可能不一定总是可用作用户的可能解决方案可能在其显示器上具有敏感数据然后注销。另一个来了(虽然工作站应该被锁定;))并按下并看到(虽然缓存)前一个用户的数据。我们通常会添加一条信息消息,提醒用户关闭浏览器(以确保所有会话都已清除)。它不一定是最好的方式,但至少你给了用户有关潜在问题的信息。 - Juri
如果所有其他方法都失败的便宜修复将在注销页面上显示“请关闭此窗口以确保安全”消息。 - izb
我面临同样的问题。如果用户点击后退按钮并且不再登录,是否有显示不同内容的内容?我想不要使用任何客户端。 Facebook这样做,如果您在注销后注意到,如果您尝试返回它将显示不同的页面,无论是否启用或禁用任何客户端。这是怎么做到的?我假设可能还有更多它只是缓存控制?希望有人对此有一些很好的见解。 - toystory


答案:


用PHP而不是javascript实现它。

在每个页面的顶部,检查用户是否已登录。如果没有,则应将其重定向到登录页面:

<?php 
      if(!isset($_SESSION['logged_in'])) : 
      header("Location: login.php");  
?>

正如您所提到的,在注销时,只需取消设置logged_in会话变量,然后销毁会话:

<?php
      unset($_SESSION['logged_in']);  
      session_destroy();  
?>

如果用户现在单击后退,则没有logged_in会话变量可用,并且页面将不会加载。


9
2018-05-09 09:04



我已经实现了这种技术。但是回击按钮实际上并没有请求服务器。而是从浏览器缓存呈现后页。因此,它不会重定向到登录页面。 - piyush
那么问题是什么?注销后用户无法与服务器交互,后退按钮只能检索他已经看过的数据。如果这些数据可能被其他人滥用,只需注意用户关闭窗口或使用匿名标签,如果他没有,那就是他的错。 - david


我正面临同样的问题,花了一整天时间搞清楚它, 最后纠正如下:

在登录验证脚本中,如果用户已通过身份验证,请设置一个会话值,例如:

$_SESSION['status']="Active";

然后在User Profile脚本中输入以下代码片段:

<?php

session_start();

if($_SESSION['status']!="Active")
{
    header("location:login.php");
}

?>

以上代码的作用是,仅当且仅当 $_SESSION['status'] 被设定为 "Active" 然后只会转到用户配置文件,此会话密钥将设置为 "Active" 只有用户通过身份验证... [注意否定['!上面的代码片段中的']

可能注销代码应如下所示:

{
    session_start();
    session_destroy();
    $_SESSION = array();
    header("location:login.php");
}

希望这可以帮助...!!!


3
2018-03-03 11:23





我认为你唯一的服务器端选项是禁止缓存。如果您使用Javascript繁重的应用程序,这实际上并不是那么糟糕,因为您的主HTML可能只是一系列JS调用,然后动态生成视图。这样,大部分数据(JS MVC和核心代码)都被缓存,但实际的页面请求却没有。

要添加到下面粘贴的评论中,我建议在加载时添加一个小的AJAX调用,即使对于发送到后端并检查会话的缓存页面也会触发。如果没有找到会话,则会将用户重定向。这是客户端代码而不是安全修复,当然,但看起来更好。

你可以从良心中解脱出来

如果所有其他方法都失败的便宜修复将在注销页面上显示“请关闭此窗口以确保安全”消息。 - izb '12年5月9日8:36

但就像N.B.说过

您不必禁用任何内容。如果他们返回,他们将被提供受限制页面的缓存版本。如果他们试图点击它,没有任何东西可以工作,因为不会设置适当的会话。 - N.B. 12月5日在7:50


1
2018-01-28 07:54





您可以在每个受限页面上插入条件/函数,检查是否设置了适当的会话变量。这样,您可以打印2个版本的页面(一个用于有效用户,一个用于重定向到登录页面)


0
2018-05-09 08:32



我已经实现了这个。但它不会阻止用户在单击“返回”按钮时呈现页面,因为它是从浏览器的缓存中呈现的。虽然,如果用户刷新页面或在页面上执行任何操作,他将被重定向回登录页面。由于内页中可能只有很少的个人信息,我想限制用户通过在注销后按回按钮来查看前一页。 - piyush


避免用户返回并不是一个好理由,而且最重要的是根本不安全。

如果您在网站上的每个“管理”操作之前测试用户的会话,您应该没问题,即使用户点击后退按钮,查看缓存页面并尝试某些操作。

由于会话不再有效,“绑定某事”将返回错误。

相反,你应该专注于拥有一个真正安全的后台办公室。


0
2018-05-09 08:38





这是一个简单快捷的解决方案。

到登录表单标签添加 target="_blank" 它在不同的窗口中显示内容。然后在注销后关闭该窗口并解决后退按钮问题(Safari浏览器)。

即使尝试使用历史记录也不会显示页面,而是重定向到登录页面。这适用于Safari浏览器,但适用于Firefox等其他浏览器 session_destroy(); 照顾它。


0
2017-07-03 15:30





您需要携带的页面,使用 setInterval 每1000毫秒检查用户是否已登录或未使用ajax。如果用户会话无效,请将其重定向到登录页面。


0
2017-09-13 06:24





请注意,虽然用户在重置会话数据和/或cookie后无法更改任何内容,但他们仍可能会看到登录用户可以访问的常用信息,因为它们在上次访问时出现。这是由浏览器缓存页面引起的。

您必须确保在登录用户可访问的每个页面上添加标题,告诉浏览器数据是敏感的,并且不应该为后退按钮缓存脚本结果。重要的是要添加

header("Cache-Control: no-cache, must-revalidate");

请注意,除了此标题下脚本的直接结果之外的其他元素仍将被缓存,您可以从中受益。看到您逐渐加载页面的一部分并使用此标头标记敏感数据和主HTML。

正如答案所暗示的那样,取消了 logged_in 的一部分 $_SESSION 全局变量可以实现注销,但要注意,首先,你不需要像在中提到的那样销毁会话 PHP的 session_destroy() 文件

注意:您不必从通常的代码调用session_destroy()。清理$ _SESSION数组而不是销毁会话数据。

第二,你最好不要破坏会话,因为文档中的下一个警告解释了。

也, unset() 是一个懒惰的功能;意味着它不会应用效果,直到下次使用(部分)变量有问题。优良作法是在敏感案例中使用赋值立即生效,主要是可以在并发请求中使用的全局变量。我建议你改用它:

$_SESSION['logged_in'] = null;

让垃圾收集器收集它,同时它作为登录用户无效。

最后,要完成解决方案,以下是一些功能:

<?php
/*
 * Check the authenticity of the user
 */
function check_auth()
{
   if (empty($_SESSION['logged_in']))
   {
      header('Location: login.php');
      // Immediately exit and send response to the client and do not go furthur in whatever script it is part of.
      exit();
   }
}

/*
 * Logging the user out
 */
function logout()
{
   $_SESSION['logged_in'] = null;
   // empty($null_variable) is true but isset($null_variable) is also true so using unset too as a safeguard for further codes
   unset($_SESSION['logged_in']);
   // Note that the script continues running since it may be a part of an ajax request and the rest handled in the client side.
}

0
2017-09-22 20:37





这是我在我的应用程序中使用的简单解决方案。

在登录HTML页面中的脚本标记内添加以下代码(或在注销后重定向到的任何页面)

<script>
    history.pushState(null, null, null);
    window.addEventListener('popstate', function () {
        history.pushState(null, null, null);
    });
</script>

它将禁用后退按钮。单击后退按钮将无法返回。

注意:未在Safari上测试过。


0
2018-02-06 14:02



这是什么文件.title - vijju
嗨Vijju,Javascript将获取页面的标题,无论你在head标签中给出了什么。你可以将它作为null,它将在上面的问题中按要求工作。 - Mashmoom
我编写了答案,并在我的申请中进行了测试。工作正常。 - Mashmoom
HII @Mashmoom。我有另一个疑问,那就是当我打开登录页面并单击后退按钮按钮时,它不会返回到主页面。当用户从网站注销时,只有后退按钮被禁用。它的工作时间很长 - vijju
我知道了。你的意思是通常如果一个人进入登录页面然后返回按钮需要工作,但只有在注销后它才会被禁用ryt?我能想到的是另一个登录页面看起来像是相同的登录页面。但是只有在注销时它才能进入第二个注销页面,其中包含上面的脚本。 - Mashmoom