zoukankan      html  css  js  c++  java
  • 危急,不要任意让站点记住password自己主动登陆!

    为了方便用户登录,差点儿全部的站点都实现了“记住password”、“自己主动登陆”这样似乎人性化的功能。


    我也非常喜欢这个功能,由于我自己的脑子实在是讨厌记东西。


    为了安全起见。我的password都设置的非常复杂,满足“数字+特殊符号+英文字母大写和小写”。
    但password一复杂,我就总记不住,就想让站点替我记住。
    但殊不知。这背后隐藏着巨大的风险。
    我先劝大家一声:“危急,不要任意让站点记住password自己主动登陆。”
    要了解事情的真相,请随我来看一看怎样利用cookie实现记住password自己主动登陆。

    第一步、构建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="请输入登录password" />
            </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记住password

    @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中取出登陆用户名、password等关键信息

    @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);
        }
    
    }

    这里写图片描写叙述

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

    到此为止,自己主动登陆的功能已经实现了。
    那么,如今能够说一些负责任的话了。

    这里写图片描写叙述

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

    这里写图片描写叙述

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

    这里写图片描写叙述

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

    所以。作为一个不务正业的IT狗来说,我奉劝各位,“危急。不要任意让站点记住password自己主动登陆!


    假如你的电脑这会被我用。而你又选择让站点记住password。那对不起了,你再复杂的password也只是是一串明文而已!
    当然了。放心了。我是不会去看你的password了。
    只是浏览器会不会看你的password我就不敢保证了。
    既然为了安全,设置了超长超复杂的password,那么每次就手动输一下嘛,不麻烦,安全得非常!

    不务正业的IT狗,喜欢读书和写作!

    微信扫一扫下方二维码就可以关注 沉默王二 公众号:

  • 相关阅读:
    颜色空间
    C++ lambda表达式
    nVidia的物理系统
    UE3客户端服务器GamePlay框架
    UE3中Object和Actor的创建与销毁
    git-lfs插件
    【SpringCloud】Spring Cloud Alibaba 之 Sentinel 持久化规则(三十五)
    【SpringCloud】Spring Cloud Alibaba 之 Sentinel 与OpenFeign整合(三十四)
    【SpringCloud】Spring Cloud Alibaba 之 Sentinel @SentinelResource使用(三十三)
    【SpringCloud】Spring Cloud Alibaba 之 Sentinel热点参数限流与系统自适应限流(三十二)
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8667945.html
Copyright © 2011-2022 走看看