我想在他/她关闭浏览器时自动注销用户,并且他/她是否点击了浏览器的后退按钮

时间:2012-08-12 12:36:15

标签: php session cookies login

我的logout.php代码

<?php 
 $past = time(0); 
 setcookie(ID_my_site, gone, $past); 
 setcookie(Key_my_site, gone, $past); 
 header("Location: index.php"); 
 ?>

我需要在此代码中添加什么才能在用户关闭浏览器时注销用户并且他/她是否点击了浏览器的后退按钮?

我的login.php代码

<?php 
$page = "login";
mysql_connect("localhost","root","");
mysql_select_db("nell");
 if(isset($_COOKIE['ID_my_site']))
 { 
    $username = $_COOKIE['ID_my_site']; 
    $pass = $_COOKIE['Key_my_site'];
        $check = mysql_query("SELECT * FROM users WHERE username = '$username'")or die(mysql_error());
    while($info = mysql_fetch_array( $check ))  
        {
        if ($pass != $info['password']) 
            {                       }
        else
            {header("Location: members.php");}
        }
    }
 if (isset($_POST['submit'])) { 
    if(!$_POST['username'] | !$_POST['pass']) 

    { header("Location: error.php");}

    if (!get_magic_quotes_gpc()) {
        $_POST['email'] = addslashes($_POST['email']);
    }
    $check = mysql_query("SELECT * FROM users WHERE username = '".$_POST['username']."'")or die(mysql_error());
 $check2 = mysql_num_rows($check);
 if ($check2 == 0) 

    { header("Location: error2.php");}

 while($info = mysql_fetch_array( $check ))     
 {
 $_POST['pass'] = stripslashes($_POST['pass']);
    $info['password'] = stripslashes($info['password']);
    $_POST['pass'] = md5($_POST['pass']);
if ($_POST['pass'] != $info['password']) 

        { header("Location: error3.php");}

     else 
 { 
     $_POST['username'] = stripslashes($_POST['username']); 
     $hour = time() + 3600; 
 setcookie(ID_my_site, $_POST['username'], $hour); 
 setcookie(Key_my_site, $_POST['pass'], $hour);   
 header("Location: members.php"); 
 } 
 } 
 } 
 else 
{    }
 ?> 

请帮助,我想在他/她关闭浏览器时自动注销用户,并且他/她是否点击了浏览器的后退按钮。

2 个答案:

答案 0 :(得分:3)

当用户关闭浏览器时,您无法在PHP中确定 - 就PHP而言,然后将页面发送给用户,PHP就完成了。

可以 使用会话来与用户计算机进行更好的联系,而不是使用Cookie。你可以做一些事情,例如将会话超时设置为仅几分钟,但这样做会冒一个慢读者或花时间从一个页面移动到另一个页面的人将被锁定的风险。

如果您希望在用户注销时成为一个真正的意思,您可能需要在常规“签到”中执行类似javascript的操作,将数据发送到服务器以使会话保持活动状态 - 会话时间短可能会达到你想要的结果。

编辑:您发布的代码还显示旧的mysql_*函数,以及root用户和访问数据库的密码。请死神告诉我你刚插入该用户作为占位符。其次,请转到PDO或mysqli,以避免让第一个恼怒的用户对您的网站进行管理。

您甚至没有检查包含用户名“bob; drop table users”的$_POST数据。这意味着我可以弹出它,你的网站是 kaput 。 Google SQL Injection,修复您的代码。马上。严重。

编辑2:正如Adnan指出的那样,您可以将您的Cookie到期日期设置为0,只有会话开放时才会保留该日期。我一般认为在cookie中保留用户名是很好的,但是留下用户输入的密码对于安全性来说更好,你也可以采用这种方法。

编辑3:根据您的代码:

<?php 
    $page="logout"; 
    $security=true; 
    session_start(); 
    if (!isset($_SESSION['EXPIRES']) || $_SESSION['EXPIRES'] < time()+3600) 
    { 
        session_destroy(); 
        $_SESSION = array(); 
    } 
    $_SESSION['EXPIRES'] = time() + 3600; 
    header("location: login_admin.php"); 
?> 

为什么不直接设置会话变量:

$_SESSION['isAdmin']=true;

当他们登录管理员功能并在他们退出管理员功能时将其更改为false?无需终止整个会话,只需更改保存在其中的单个变量即可。

答案 1 :(得分:-1)

您可以使用javascript unload事件作为回发到PHP代码的触发器。

http://api.jquery.com/unload/