危險,不要隨意讓網(wǎng)站記住密碼自動登陸救氯!

為了方便用戶登錄找田,幾乎所有的網(wǎng)站都實現(xiàn)了“記住密碼”、“自動登陸”這樣似乎人性化的功能着憨。
我也很喜歡這個功能墩衙,因為我自己的腦子實在是討厭記東西。
為了安全起見甲抖,我的密碼都設(shè)置的很復(fù)雜漆改,滿足“數(shù)字+特殊符號+英文字母大小寫”。
但密碼一復(fù)雜准谚,我就總記不住挫剑,就想讓網(wǎng)站替我記住。
但殊不知柱衔,這背后隱藏著巨大的風險樊破。
我先勸大家一聲:“危險愉棱,不要隨意讓網(wǎng)站記住密碼自動登陸!”
要了解事情的真相哲戚,請隨我來看一看如何利用cookie實現(xiàn)記住密碼自動登陸奔滑。

第一步、構(gòu)建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("登陸成功后跳轉(zhuǎn)");
        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中取出登陸用戶名、密碼等關(guān)鍵信息

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

}
這里寫圖片描述

當我輸入了賬號秒裕、以及密碼后袱蚓,勾選上“下次自動登陸”,那么系統(tǒng)在驗證通過后簇爆,就會通過cookie記住我的用戶名和密碼癞松,下次不用再輸入賬號和密碼,直接點擊登陸就進入系統(tǒng)入蛆。

到此為止响蓉,自動登陸的功能已經(jīng)實現(xiàn)了。
那么哨毁,現(xiàn)在可以說一些負責任的話了枫甲。

這里寫圖片描述

在瀏覽器的開發(fā)者模式下,注意紅色框中的“type='password'”扼褪,此時我們將type修改為text想幻。

這里寫圖片描述

注意,注意话浇,你是不是已經(jīng)發(fā)現(xiàn)了脏毯,密碼不再是密碼了,成了明文了幔崖。
你食店,此刻是否心驚肉跳了?

這里寫圖片描述

對赏寇,XX(這文章會被和諧嗎吉嫩,不至于吧,這早已經(jīng)不是秘密了嗅定,是個程序員都知道)也這樣自娩!

所以,作為一個不務(wù)正業(yè)的IT狗來說渠退,我奉勸各位忙迁,“危險脐彩,不要隨意讓網(wǎng)站記住密碼自動登陸!”
假如你的電腦這會被我用动漾,而你又選擇讓網(wǎng)站記住密碼丁屎,那對不起了荠锭,你再復(fù)雜的密碼也不過是一串明文而已旱眯!
當然了,放心了证九,我是不會去看你的密碼了删豺。
不過瀏覽器會不會看你的密碼我就不敢保證了。
既然為了安全愧怜,設(shè)置了超長超復(fù)雜的密碼呀页,那么每次就手動輸一下嘛,不麻煩拥坛,安全得很蓬蝶!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市猜惋,隨后出現(xiàn)的幾起案子丸氛,更是在濱河造成了極大的恐慌,老刑警劉巖著摔,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缓窜,死亡現(xiàn)場離奇詭異,居然都是意外死亡谍咆,警方通過查閱死者的電腦和手機禾锤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摹察,“玉大人恩掷,你說我怎么就攤上這事」┖浚” “怎么了黄娘?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長查坪。 經(jīng)常有香客問我寸宏,道長,這世上最難降的妖魔是什么偿曙? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任氮凝,我火速辦了婚禮,結(jié)果婚禮上望忆,老公的妹妹穿的比我還像新娘罩阵。我一直安慰自己竿秆,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布稿壁。 她就那樣靜靜地躺著幽钢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪傅是。 梳的紋絲不亂的頭發(fā)上匪燕,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音喧笔,去河邊找鬼帽驯。 笑死,一個胖子當著我的面吹牛书闸,可吹牛的內(nèi)容都是我干的尼变。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼浆劲,長吁一口氣:“原來是場噩夢啊……” “哼嫌术!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牌借,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤度气,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后走哺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚯嫌,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年丙躏,在試婚紗的時候發(fā)現(xiàn)自己被綠了择示。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡晒旅,死狀恐怖栅盲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情废恋,我是刑警寧澤谈秫,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鱼鼓,受9級特大地震影響拟烫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迄本,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一硕淑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦置媳、人聲如沸于樟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迂曲。三九已至,卻和暖如春寥袭,著一層夾襖步出監(jiān)牢的瞬間路捧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工纠永, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鬓长,地道東北人谒拴。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓尝江,卻偏偏與公主長得像,于是被迫代替她去往敵國和親英上。 傳聞我的和親對象是個殘疾皇子炭序,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容