摘要:的特點(diǎn)主要有如下幾個(gè)唯一性時(shí)效性不可預(yù)測(cè)很多大型業(yè)務(wù)中,比如說(shuō)的找回密碼流程中,對(duì)于發(fā)給用戶的找回密碼鏈接郵件需要同時(shí)提交用戶輸入的驗(yàn)證碼和也就是該校驗(yàn)碼對(duì)應(yīng)的。
隨著互聯(lián)網(wǎng)的高速發(fā)展,WEB2.0網(wǎng)站的業(yè)務(wù)越來(lái)越龐大,一些token驗(yàn)證在許多場(chǎng)景下都必不可少,比如說(shuō)交易訂單的防止多次提交,重要的敏感操作防止CSRF(跨站請(qǐng)求偽造)攻擊,以及短信驗(yàn)證碼,找回密碼驗(yàn)證碼,注冊(cè)登錄圖形的生成和驗(yàn)證。
token的特點(diǎn)主要有如下幾個(gè):
唯一性
時(shí)效性
不可預(yù)測(cè)
很多大型業(yè)務(wù)中,比如說(shuō)BAT的找回密碼流程中,對(duì)于發(fā)給用戶的找回密碼鏈接郵件需要同時(shí)提交用戶輸入的vcode驗(yàn)證碼和vcode_md5也就是該校驗(yàn)碼對(duì)應(yīng)的token。很多人認(rèn)為這時(shí)需要一個(gè)緩存中間件比如說(shuō)Redis或者M(jìn)emcache來(lái)存儲(chǔ)校驗(yàn)碼對(duì)應(yīng)的需要重置密碼的用戶Uid。其實(shí)大可不必如此。
我們可以在服務(wù)器端使用rand()生成隨機(jī)數(shù),然后將生成的隨機(jī)數(shù)加上指定的salt做md5處理,比如說(shuō)
function vcode($uid) { $output["vcode_timestamp"] = time(); $output["vcode"] = $uid; $output["vcode_md5"] = md5("changwei"+vcode_timestamp+$uid); return $output; }
生成的時(shí)候?qū)code和vcode_md5一起通過(guò)郵件發(fā)回給客戶。
那么驗(yàn)證的時(shí)候該怎么驗(yàn)證呢?很好辦,把指定的鹽值加上校驗(yàn)碼以及其他附帶信息(比如說(shuō)用戶UID)進(jìn)行md5運(yùn)算,和客戶端提交的那個(gè)事先發(fā)給客戶端的vcode_md5進(jìn)行比較,如果一致那么就通過(guò)。
那么我們來(lái)看看這是否具有token的幾個(gè)特點(diǎn)呢?首先,唯一性,可以通過(guò)uid(這個(gè)一般是用戶表的遞增主鍵,不會(huì)重復(fù)),并且將當(dāng)前時(shí)間戳作為隨機(jī)數(shù)種子,基本上可以認(rèn)為是高度隨機(jī)的數(shù)字了,加上md5加鹽運(yùn)算之后客戶有視為高度近似的唯一性了。不可預(yù)測(cè)性呢?由于指定的salt是存儲(chǔ)在服務(wù)端,只要這個(gè)salt足夠復(fù)雜而且沒(méi)有被泄漏,那么這個(gè)vcode_md5肯定是無(wú)法被客戶端預(yù)測(cè)的,也保證了這個(gè)方案的安全性。
最后就是時(shí)效性了,很多人總在糾結(jié),如果沒(méi)有Redis或Memcache,那么如何去存儲(chǔ)他的時(shí)效性呢?通過(guò)cookie嗎?不行,cookie是在客戶端的,那么意味著是用戶可控的,不安全。用session呢?標(biāo)題寫了是低成本解決方案,session存儲(chǔ)在服務(wù)端,在高并發(fā)請(qǐng)求數(shù)量龐大的大型網(wǎng)站中,每時(shí)每刻都有成千上萬(wàn)的校驗(yàn)碼生成,如果都存在session對(duì)于服務(wù)器壓力(尤其是IO)是十分大的。那么還有什么辦法呢?我們想想,既然md5是消息摘要算法,那么他就可以用來(lái)驗(yàn)證數(shù)據(jù)在傳輸中途是否經(jīng)過(guò)了篡改,那么思路就來(lái)了,我們?cè)诎l(fā)回給用戶的表單中再加一個(gè)隱藏域,名字為vcode_timestamp,后端算法再改一改,這次提供完整的驗(yàn)證算法源代碼。
function vcode($uid) { $output["vcode_timestamp"] = time(); $output["vcode"] = $uid; $output["vcode_md5"] = md5("changwei"+vcode_timestamp+$uid); return $output; } function verify() { if(md5("changwei"+$_POST["vcode_timestamp"]+$_POST["uid"])===$_POST["vcode_md5"]) { if(time()這樣一來(lái)時(shí)效性也可以驗(yàn)證了,全過(guò)程沒(méi)有涉及到任何服務(wù)器端的存儲(chǔ)引擎,可以說(shuō)是把成本降到了最低。而且md5本身也是目前效率非常高的hash算法,對(duì)于cpu的消耗也不是很大。
目前我的網(wǎng)站lol.changwei.me
中取消監(jiān)控鏈接便用的是該方案,經(jīng)過(guò)上線一個(gè)月的測(cè)試,基本上沒(méi)有出現(xiàn)什么BUG。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21792.html
摘要:的特點(diǎn)主要有如下幾個(gè)唯一性時(shí)效性不可預(yù)測(cè)很多大型業(yè)務(wù)中,比如說(shuō)的找回密碼流程中,對(duì)于發(fā)給用戶的找回密碼鏈接郵件需要同時(shí)提交用戶輸入的驗(yàn)證碼和也就是該校驗(yàn)碼對(duì)應(yīng)的。 隨著互聯(lián)網(wǎng)的高速發(fā)展,WEB2.0網(wǎng)站的業(yè)務(wù)越來(lái)越龐大,一些token驗(yàn)證在許多場(chǎng)景下都必不可少,比如說(shuō)交易訂單的防止多次提交,重要的敏感操作防止CSRF(跨站請(qǐng)求偽造)攻擊,以及短信驗(yàn)證碼,找回密碼驗(yàn)證碼,注冊(cè)登錄圖形的生...
摘要:微信任意用戶密碼修改漏洞漏洞描述在微信官方的首頁(yè)上發(fā)現(xiàn)了找回密碼功能。選擇通過(guò)手機(jī)號(hào)碼找回密碼。提交成功,輸入新密碼。網(wǎng)易郵箱可直接修改其他用戶密碼描述這次我們看一個(gè)郵箱的找回密碼漏洞,這個(gè)還真和上面的方式有點(diǎn)不一樣。 來(lái)自 GitChat 作者:湯青松更多使用技術(shù),盡在微信公眾號(hào):GitChat技術(shù)雜談 進(jìn)入 GitChat 閱讀原文 WEB安全用戶密碼找回多案例安全攻防實(shí)戰(zhàn) 這次文...
摘要:登錄注冊(cè)安全風(fēng)險(xiǎn)登錄注冊(cè)的風(fēng)險(xiǎn)點(diǎn)主要有四個(gè)暴力破解撞庫(kù)遍歷注冊(cè)用戶批量注冊(cè)。引入了驗(yàn)證碼機(jī)制同樣引入了額外的安全風(fēng)險(xiǎn),比如短信驗(yàn)證碼的短信炸彈風(fēng)險(xiǎn)圖形驗(yàn)證碼的可繞過(guò)可識(shí)別等。 概述 很多技術(shù)研發(fā)不了解安全,也不重視安全,只有在自己的服務(wù)器被黑掉、被掛馬、被脫褲才想起關(guān)注安全,但是這個(gè)時(shí)候,技術(shù)架構(gòu)已經(jīng)成型、代碼已經(jīng)在線上穩(wěn)定運(yùn)行,再亡羊補(bǔ)牢,改代碼、改策略,往往成本巨大、確收效很低。所...
閱讀 2996·2021-10-12 10:17
閱讀 1599·2021-09-01 11:38
閱讀 1093·2019-08-30 15:44
閱讀 3490·2019-08-26 18:36
閱讀 520·2019-08-26 13:25
閱讀 1891·2019-08-26 10:29
閱讀 2845·2019-08-23 15:58
閱讀 768·2019-08-23 12:59