調(diào)用后端接口怎么樣才安全单芜?
在APP中保存登錄數(shù)據(jù)蜕该,每次調(diào)用接口時傳輸
程序員總能給自己找到偷懶的方法,有的程序為了省事洲鸠,會在用戶登錄后堂淡,直接把用戶名和密碼保存在本地,然后每次調(diào)用后端接口時作為參數(shù)傳遞扒腕。真省事兒熬畹怼!可這種方法簡單就像拿著一袋子錢在路上邊走邊喊“快來搶我呀瘾腰!快來搶我呀皆的!”,一個小小的嗅探器就能把用戶的密碼拿到手蹋盆,如果用戶習(xí)慣在所有地方用一個密碼费薄,那么你闖大禍了,黑客通過撞庫的方法能把用戶的所有信息一鍋端栖雾。
登錄時請求一次token楞抡,之后用token調(diào)用接口
這是比較安全的方式,用戶在登錄時析藕,APP調(diào)用獲取token的接口(比如 http://api.abc.com/get_token/)召廷,用post將用戶名和密碼的摘要傳遞給服務(wù)器,然后服務(wù)器比對數(shù)據(jù)庫中的用戶信息噪径,匹配則返回綁定該用戶的token(這一般翻譯為令牌柱恤,很直觀的名字,一看就知道是有了這玩意找爱,就會對你放行)梗顺,而數(shù)據(jù)庫中,在用戶的token表中也同時插入了這個token相關(guān)的數(shù)據(jù):這個token屬于誰车摄?這個token的有效期是多久寺谤?這個token當(dāng)前登錄的ip地址是仑鸥?這個token對應(yīng)的deviceid是?……
這樣即便token被有心人截獲变屁,也不會造成太大的安全風(fēng)險眼俊。因為沒有用戶名和密碼,然后如果黑客通過這個token偽造用戶請求粟关,我們在服務(wù)器端接口被調(diào)用時就可以對發(fā)起請求的ip地址疮胖、user-agent之類的信息作比對,以防止偽造闷板。再然后澎灸,如果token的有效期設(shè)得小,過一會兒它就過期了遮晚,除非黑客可以持續(xù)截獲你的token性昭,否則他只能干瞪眼。(插一句題外話:看到這里县遣,是不是明白為什么不推薦在外面隨便接入來歷不明的wifi熱點了糜颠?)
tips:token如何生成? 可以根據(jù)用戶的信息及一些隨機(jī)信息(比如時間戳)再通過hash編碼(比如
md5萧求、sha1等)生成唯一的編碼其兴。
tips:token的安全級別,取決于你的實際需求饭聚,所以如果不是涉及財產(chǎn)安全的領(lǐng)域忌警,并不建議太嚴(yán)格
(比如用戶走著走著,3G換了個基站秒梳,閃斷了一下IP地址變了法绵,尼瑪token過期了,這就屬于為了不必要
的安全丟了用戶體驗酪碘,當(dāng)然如果變換的IP地址跨省的話還是應(yīng)該驗證一下的朋譬,想想QQ有時候會讓填驗證碼
就明白了)。
tips:接口在返回信息時兴垦,可以包含本次請求的狀態(tài)徙赢,比如成功調(diào)用,那么result['status']可能就
是'success'探越,而反之則是'error'狡赐,而如果是'error',則result['errcode']中就可以包含錯誤
的原因钦幔,比如errcode中是'invalid_token'就可以告訴APP這個token過期或無效枕屉,這時APP應(yīng)彈出
登錄框或者用本地存儲的用戶名或密碼再次請求token(用戶選擇“記住密碼”,就應(yīng)該在本地保存用戶名
和密碼的摘要鲤氢,方法見plus.storage的文檔)搀擂。
更安全一點西潘,獲取token通過SSL
剛才的方法,機(jī)智一點兒的讀者大概會心存疑慮:那獲取token時不還是得明文傳輸一次密碼嗎哨颂?
是的喷市,你可以將這個獲取token的地址,用SSL來保護(hù)( 比如https://api.abc.com/get_token/ )威恼,這樣黑客即使截了包品姓,一時半會兒也解不出什么信息。
SSL證書的獲取渠道很多箫措,我相信你總有辦法查到缭黔,所以不廢話了。不過話說namecheap上的SSL證書比godaddy的要便宜得多……(這是吐槽)
tips:前段時間OpenSSL漏洞讓很多服務(wù)器遭殃蒂破,所以如果自己搭服務(wù)器,一定記得裝補(bǔ)丁别渔。
tips:可以把所有接口都弄成SSL的嗎附迷?可以。但會拖慢服務(wù)器哎媚,如果是配置并不自信的VPS喇伯,建議不折騰。
還要更更安全(這標(biāo)題真省事)
還記得剛才APP向服務(wù)器請求token時拨与,可以加入的用戶信息嗎稻据?比如用戶的設(shè)備deviceid。
如果我們在調(diào)用接口時买喧,還附帶一個當(dāng)前時間戳參數(shù)timestamp捻悯,同時,用deviceid和這個時間戳再生成一個參數(shù)sign淤毛,比如 md5(deviceid timestamp token)這樣的形式今缚。而服務(wù)端首先驗證一下參數(shù)中的時間戳與當(dāng)前服務(wù)器時間是否一致(誤差保持在合理范圍內(nèi)即可,比如5分鐘)低淡,然后根據(jù)用戶保存在服務(wù)器中的deviceid來對參數(shù)中的時間戳進(jìn)行相同的變形姓言,驗證是否匹配,那便自然“更更安全”了蔗蹋。
tips:如果對整個調(diào)用請求中的參數(shù)進(jìn)行排序何荚,再以deviceid和timestamp加上排序后的參數(shù)來對整個調(diào)用生成1個sign,黑客即使截獲sign猪杭,不同的時間點餐塘、參數(shù)請求所使用的sign也是不同的,難以偽造胁孙,自然會更安全唠倦。當(dāng)然称鳞,寫起來也更費事。
tips:明白了原理稠鼻,整個驗證過程是可以根據(jù)自己的需求改造的冈止。