如何防止用户从被破坏的会话中“返回”页面?

时间:2011-03-06 22:10:34

标签: php

我在我的网站上创建了登录功能,当我点击退出时,页面会重定向并销毁会话,这很好。

然而,当我点击后退按钮时,我仍然可以查看该页面。如果我刷新它,那么它将重定向我登录,因为会话已被销毁,并且用户无法像预期那样访问该页面。

有没有办法阻止用户点击后退按钮时能够查看该页面?

4 个答案:

答案 0 :(得分:4)

它可能只是显示缓存的结果。

echo time();放入页面的某个位置,然后如果您在点击后退按钮时查看相同的时间字符串,则只是您的浏览器缓存页面,在这种情况下它是无害的(他们只会查看他们之前已经访问过的信息,无论如何他们都可以保存为下载的页面,因此无需担心)。

答案 1 :(得分:2)

session_destroy()仅在重新加载页面或重定向到另一个页面时清空变量。如果用户返回同一页面,则在session_destroy()之后变量仍然可用。

我建议也取消设置应该解决问题的每个变量。 例: 未设置($ _ SESSION [ '无论'])

因此,在您的注销功能首先取消设置每个变量时,销毁会话然后重新路由到另一个页面。

答案 2 :(得分:1)

尝试执行

header( 'Location: http://mySerbver.com/anURL' );
在你破坏了会话之后

。这使得返回上一页至少有点复杂。要返回,用户必须再次单击两次。

如果您想让它变得更复杂,请执行

标题('位置:http://mySerbver.com/myScript.php?onceMore=yes');

如果myScript.php找到

 isset( $_GET[ 'onceMore' ] )

然后执行

 header( 'Location: http://mySerbver.com/myScript.php' );

再次。

myScript.php:

<?php

  // Force the browser to redirect once again
  if ( isset( $_GET[ 'onceMore' ] ) {
    header( 'Location: http://mySerbver.com/myScript.php' );
  }

  // else continue with normal stuff.
 ...         

此外,指示浏览器不缓存页面可能会有所帮助:

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");   // date in past

请注意,该浏览器可能会也可能不会尊重此标题。因此,您可能需要发送更多与缓存相关的标头。

答案 3 :(得分:1)

您可以使用header()解决此问题。我使用以下代码进行注销:

session_start();
unset($_SESSION['logged_usr_id']);
unset($_SESSION['logged_f_name']);
unset($_SESSION['logged_l_name']);
unset($_SESSION['logged_email']);
unset($_SESSION['fname']);
unset($_SESSION['lname']);
unset($_SESSION['email_v']);
unset($_SESSION['email_cnf_v']);
unset($_SESSION['pass_v']);
unset($_SESSION['pass_cnf_v']);
session_destroy();

//i try to kill again sesion :D
foreach($_SESSION as $type => $value) {
    unset($type);
}
header( 'Location: index.php' );