繁体   English   中英

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

[英]How do I prevent users from being able to “back” into page from a destroyed session?

我已经在网站上创建了登录功能,并且当我单击注销时,页面会重定向并破坏会话,这很好。

但是,当我单击“后退”按钮时,我仍然可以查看该页面。 如果我刷新它,则它将重定向我以登录,因为会话已被破坏并且用户无法按预期访问该页面。

有什么方法可以防止用户单击后退按钮时查看该页面?

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

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

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

我建议还取消设置应该解决您的问题的每个变量。 示例:unset($ _ SESSION ['whatever'])

因此,在注销函数中,首先取消设置每个变量,销毁会话,然后重新路由到另一个页面。

尝试执行一个

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

在您确实销毁了会话之后。 这使得返回到上一页至少有点复杂。 要返回,用户必须单击两次。

如果您想使其更加复杂,请执行

header('Location: 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

请注意,浏览器可能会或可能不会遵守此标头。 因此,您可能需要发送更多与缓存相关的标头。

您可以使用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' );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM