美文网首页spring相关技术@IT·互联网程序员
危险,不要随意让网站记住密码自动登陆!

危险,不要随意让网站记住密码自动登陆!

作者: 沉默王二 | 来源:发表于2017-05-10 08:53 被阅读321次

为了方便用户登录,几乎所有的网站都实现了“记住密码”、“自动登陆”这样似乎人性化的功能。
我也很喜欢这个功能,因为我自己的脑子实在是讨厌记东西。
为了安全起见,我的密码都设置的很复杂,满足“数字+特殊符号+英文字母大小写”。
但密码一复杂,我就总记不住,就想让网站替我记住。
但殊不知,这背后隐藏着巨大的风险。
我先劝大家一声:“危险,不要随意让网站记住密码自动登陆!”
要了解事情的真相,请随我来看一看如何利用cookie实现记住密码自动登陆。

第一步、构建form表单

<form class="form-signin required-validate" action="${ctx}/login?callbackType=forward">
    ${token}
    <div class="form-group">
        <div class="row">
            <input class="form-control" type="text" autofocus name="username" value="${username}" placeholder="请输入会员编号" />
        </div>
    </div>

    <div class="blank10"></div>

    <div class="form-group">
        <div class="row">
            <input class="form-control" type="password" name="password" value="${password}" placeholder="请输入登陆密码" />
        </div>
    </div>

    <div class="form-group">
        <div class="row">
            <div class="checkbox">
                <label> <input type="checkbox" value="1" <c:if test="${isSave == 'true'}">checked</c:if> name="isSave" /> 下次自动登录
                </label>
            </div>
        </div>
    </div>
    <div class="form-group">
        <div class="row">
            <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
        </div>
    </div>

</form>

第二步、登陆时利用cookie记住密码

@RequestMapping("/login")
public ModelAndView login(HttpServletResponse response,
        @RequestParam(value = "username", required = false) String username,
        @RequestParam(value = "password", required = false) String password) {
    try {
        boolean isSave = getParaToBoolean("isSave", false);
        logger.debug("isSaved " + isSave);

        // 尝试获取cookie
        String cookieUser = CookieUtil.getCookieByName(request, Constants.COOKIE_USER);
        logger.debug("cookie的值为:" + cookieUser);

        // 验证用户信息
        Members user = memberService.selectByUsername(username);
        // 如果IP不同,则清除cookie
        if (cookieUser != null) {
            if (!user.getLastip().equals(request.getRemoteAddr())) {
                // 移除自动登录cookie信息
                CookieUtil.removeCookie(response, Constants.COOKIE_USER);// 删除cookie
            }
        }

        MembersValidator.checkPassword(password, user.getPassword());

        user.setLastip(request.getRemoteAddr());// 更新登录id 和最后登录时间
        memberService.updateLastvisit(user);

        checkToken();

        int max_age = Variables.cookie_expire * 3600 * 24;
        if (isSave) {
            // 将自动登录信息存入cookie
            CookieUtil.setCookie(response, Constants.COOKIE_USER,
                    DesUtils.encrypt(username + "," + password + "," + isSave), max_age);
        } else {
            // 移除自动登录cookie信息
            CookieUtil.removeCookie(response, Constants.COOKIE_USER);// 删除cookie
        }

        logger.debug("登陆成功后跳转");
        return ajaxDoneSuccess(user.getUid().toString(), (String) getSessionAttr(Constants.BEFORE_LOGIN_URL));
    } catch (Exception e) {
        logger.error(e.getMessage());
        logger.error(e.getMessage(), e);

        return ajaxDoneError(Constants.SERVER_ERROR);
    }
}

这部分代码也很清晰明了,就不做多的解释。

附上CookieUtil.java类

/**
 * Cookie工具类
 * 
 */
public class CookieUtil {

    /**
     * 添加cookie
     * 
     * @param response
     * @param name
     * @param value
     * @param maxAge
     */
    public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) {
        Cookie cookie = new Cookie(name, value);
        cookie.setPath("/");
        if (maxAge > 0) {
            cookie.setMaxAge(maxAge);
        }
        response.addCookie(cookie);
    }

    /**
     * 删除cookie
     * 
     * @param response
     * @param name
     */
    public static void removeCookie(HttpServletResponse response, String name) {
        Cookie uid = new Cookie(name, null);
        uid.setPath("/");
        uid.setMaxAge(0);
        response.addCookie(uid);
    }

    /**
     * 获取cookie值
     * 
     * @param request
     * @return
     */
    public static String getCookieByName(HttpServletRequest request, String cookieName) {
        Cookie cookies[] = request.getCookies();
        if (cookies == null) {
            return null;
        }

        for (Cookie cookie : cookies) {
            if (cookie.getName().equals(cookieName)) {
                return cookie.getValue();
            }
        }
        return null;
    }
}

第三步、从cookie中取出登陆用户名、密码等关键信息

@RequestMapping("/initLogin")
public ModelAndView initLogin() {
    logger.debug("进入登陆页");
    try {
        ModelAndView initView = new ModelAndView("login");

        String cookieUser = CookieUtil.getCookieByName(request, Constants.COOKIE_USER);
        if (cookieUser != null) {
            String decode = DesUtils.decrypt(cookieUser);
            String[] cookieUsers = decode.split(",");
            initView.addObject("username", cookieUsers[0]);
            initView.addObject("password", cookieUsers[1]);
            initView.addObject("isSave", cookieUsers[2]);
        }

        createToken();

        return initView;
    } catch (Exception e) {
        logger.error(e.getMessage());
        logger.error(e.getMessage(), e);

        return error300(Constants.SERVER_ERROR);
    }

}
这里写图片描述

当我输入了账号、以及密码后,勾选上“下次自动登陆”,那么系统在验证通过后,就会通过cookie记住我的用户名和密码,下次不用再输入账号和密码,直接点击登陆就进入系统。

到此为止,自动登陆的功能已经实现了。
那么,现在可以说一些负责任的话了。

这里写图片描述

在浏览器的开发者模式下,注意红色框中的“type='password'”,此时我们将type修改为text。

这里写图片描述

注意,注意,你是不是已经发现了,密码不再是密码了,成了明文了。
你,此刻是否心惊肉跳了?

这里写图片描述

对,XX(这文章会被和谐吗,不至于吧,这早已经不是秘密了,是个程序员都知道)也这样!

所以,作为一个不务正业的IT狗来说,我奉劝各位,“危险,不要随意让网站记住密码自动登陆!”
假如你的电脑这会被我用,而你又选择让网站记住密码,那对不起了,你再复杂的密码也不过是一串明文而已!
当然了,放心了,我是不会去看你的密码了。
不过浏览器会不会看你的密码我就不敢保证了。
既然为了安全,设置了超长超复杂的密码,那么每次就手动输一下嘛,不麻烦,安全得很!

相关文章

  • 危险,不要随意让网站记住密码自动登陆!

    为了方便用户登录,几乎所有的网站都实现了“记住密码”、“自动登陆”这样似乎人性化的功能。我也很喜欢这个功能,因为我...

  • iOS - Password AutoFill

    密码自动填充 Version - - iOS 11.0 简化登陆流程 保存密码,用户不用记住密码 一、实现原理 将...

  • vue项目实现记住密码到cookie功能(附源码)

    实现功能: 1.记住密码勾选,点登陆时,将账号和密码保存到cookie,下次登陆自动显示到表单内2.不勾选,点登陆...

  • UGUI(五)【唐老狮】登陆面板,注册面板

    登陆面板拼面板登陆面板逻辑成员变量面板控件用户名,密码输入框记住密码,自动登录开关注册,确认按钮初始化方法注册控件...

  • css

    网站中,图片文件(jpg,png,gif),如何点击下载?而非点击预览? 下载 如何修改chrome记住密码后自动...

  • 用爬虫+钉钉机器人来简化工作

    我们开发的项目为了安全,密码都是临时生成的,需要老师登陆网站获取,每次登陆挺麻烦的,我觉得这个过程可以自动化去做。...

  • 9.2 SharedPreferences

    简介:主要用于保存一些用户偏好参数,eg:是否自动登陆,是否记住账号密码等等; (类似windows上的ini文件...

  • 2019-12-09 git多账号登陆问题

    git多账号登陆问题 设置git全局记住密码: 设置git自己项目记住密码: 设置git全局设置: 需要取消git...

  • Command 脚本自动交互

    自动交互场景 ssh 以 密码 形式登陆远程主机时实现密码自动输入 解决方案 使用expect命令 expect ...

  • IOS开发之——私人通讯录数据存储

    一 概述 本文介绍私人通讯录数据存储相关的知识点: 登陆界面中:记住用户名和密码及自动登陆 添加联系人数据保存及更...

网友评论

    本文标题:危险,不要随意让网站记住密码自动登陆!

    本文链接:https://www.haomeiwen.com/subject/xnywtxtx.html