首页 > 各位大神是怎么实现网站账户注销的功能的?

各位大神是怎么实现网站账户注销的功能的?

小白今天用PHP做网站用户注销的功能时遇到了一些问题
在网上找session、cookie、以及一些demo实例来做,还是遇到不能自行解决的问题
现在唯一能求助的地方就是sf了,希望能得到解决,^_^
具体遇到的问题,自我总结有3点:
1)、总体上对于网站的登录、注销的流程或者概念上不清晰

2)、小白目前对登录、注销的概念是这样的:
用户登录->通过->写用户数据到session->相关页面判断session
用户注销->(疑问:是应该销毁session的数据还是cookie呢)

3)在销毁cookie变量的过程中,居然木有销毁成功
小白是这样写销毁cookie的代码的:
一个Cookie类中的静态方法

public static function deleteAll() {
    foreach($COOKIE as $key => $val) {
setcookie($key,'', -31536000, '/', 'http://site.cn/', false, true); } return true; }
方法写好后就试着调用了一下,用chrome查看,请求头发现先前设置的变量还在
寻求帮助,如果哪位大神看到这个问题
希望你能停下你的脚步,留下你的宝贵经验
再次先谢谢各位鼎立相助的大神,o(∩∩)o...哈哈,^
^


你的这个情况应该去销毁session,而不是cookie
销毁session只要调用:session_destroy() 函数就可以了。

关于session和cookie的关系以及如何使用,推荐你看看这篇文章:
http://www.cnblogs.com/phphuaibei/archive/2011/11/15/2250082.html

这里还有一个视频教程,讲得也很好: http://www.php100.com/html/shipinjiaocheng/PHP100shipinjiaocheng/2009/0416/827.html


登录/注销功能使用的是session。可以将session存在客户端。
当然使用的是session函数啦。


以CI框架为例:
先写入一个session到浏览器,在最后加上一段特定的加密信息用于安全,再以明文写入如'ID'这样的session信息。注销的时候销毁'ID'这一项即可。
注意:加密信息要和session里的每一项都相关,防止伪造ID。


好像用session的话 如果session用的cookie方式,注销时cookie也要销毁


先理解什么是session,什么是cookie

假设,你是VIP用户,下面是一个网站浏览,登录,登出过程.(模拟的)

1,当你打开网站, PHP给浏览器发送cookie(就像你用了$_COOKIE['PHPSESSID'] = '4ioqo3m1udlr514n5krsdn1o55';) 用于标记当前用户.服务器对应的session内容是{logined:false;role:visitor;money:0;lasttime:2012122100000000;}

2,你浏览这个网站各个页面时, 服务器要判断你是谁,才能给你返回相应的内容.比如,是普通用户呢?还是VIP用户呢?还是管理员呢?还是超级管理员呢? 浏览器很尽责,每次向服务器请求内容都会带着所有的cookie,如历史购买cookie,广告点的cookie等等(这也是cookie不能太大的原因,增加了服务器压力), 服务器就知道你的请求session_id是 4ioqo3m1udlr514n5krsdn1o55, 心想, 原来是你,刚刚还找过我呢, 我马上就返你个VIP钻图片给你...

3, 然后,你最近手头富余了,想购买点东西,要登录(因为是VIP,不登录没打折).登录时,输入用户名,密码,之类的, 验证通过, 服务器要保存你的当前登录状态,就会把 登录状态存储在一个文件上(默认是/tmp目录,可以在php.ini的session.save_path修改),当然也可存储在数据库之类的媒介...经过一翻箱倒柜,原来你就是刚才的4ioqo3m1udlr514n5krsdn1o55呀, 现在在登录了,好吧, 给你加个状态上去..于是, 你对应的session就是 {logined:true;role:vip;money:10000000000;lasttime:20121221000000;} 之类的内容.

4,你登录之后 ,就开始搜索,对比,购买之类的活动. 服务器也没闲着呢.她在忙着对比你的交互值(用户是否刷新请求了页面)是不是消耗完了(PHP.ini的session.gcmaxlifetime值),如果消耗完了就删除你的session,你就自动退出登录状态了.服务器才不管你是VIP还是管理员呢,相当霸道..当然啦,脾气也有好的时间, 这得看概率...PHP.ini可以设置session.gcprobability=100, session.gc_divisor=100, 这样的100%也是有问题的,服务器就很繁忙了,要不断扫描session,删除session....

5,购买完东西之后, 上网时间到了,要退出网站,于是你点了"退出"..这时,网站程序就用session_destroy()自动销毁当前你4ioqo3m1udlr514n5krsdn1o55的session内容

4,浏览器经常向服务器诉苦,哥们,你这id太简单,容易被人破解的,我经常背黑锅呀. 服务器就说,嗯,那好吧,我再加个token好了,浏览器就苦笑了说, token也是seesion的id好嘛,虽然是加密的.服务器就说,增加点破解难度也是好的,再弄换session_id(每次访问都更换一次id...)....这又是另一长篇了...

总而言之

PHP的登录/登出功能,用的是cookie和session组合. cookie用于标记session的id, session存储状态等内容 session不是安全的,只是比较好的"最佳"体验...session不要放客户端,cookie加个http only.


补充例子

<?php

error_reporting(E_ALL);

function getParam($key, $default = null) {
    return isset($_GET[$key]) ? $_GET[$key] : (isset($_POST[$key]) ? $_POST[$key] : $default);
}

session_start();

class Auth {

    const USER = 'admin';
    const PASSWORD = 'admin';

    public static function login($user, $password)
    {
        if ($user === self::USER && $password === self::PASSWORD) {
            $_SESSION['logined'] = true;
            return true;
        } else {
            $_SESSION['logined'] = false;
            return false;
        }
    }

    public static function check()
    {
        return isset($_SESSION['logined']) && $_SESSION['logined'];
    }

    public static function logout()
    {
        session_destroy();
    }
}

$request_do = getParam('do');
if ($request_do === 'logout') {
    Auth::logout();
    header('Location: index.php');
    exit;
}

if (!Auth::check()) :
    if ($request_do !== 'login') {
        header('Location: index.php?do=login');
        exit;
    } else {
        $request_name = getParam('name');
        $request_password = getParam('password');

        if ($request_do === 'login' && $request_name && $request_password) {            
            if (Auth::login($request_name, $request_password)) {
                header('Location: index.php');
                exit;
        } else {
            echo '<p style="color:#f50;">user or password wrong.</p>';
            }
        }
?>
  <form method="POST" action="index.php?do=login">
    <p>user:<input type="text" name="name" value=""></p>
    <p>password: <input type="password" name="password" value=""></p>
    <p><input type="submit" value="login"></p>
  </form>
<?php
    exit;
    }
// Auth::check() end.
endif;

echo ' login success' , '<a href="?do=logout">logout</a>'.PHP_EOL;
【热门文章】
【热门文章】