威脅途徑與軟件安全:保護應用安全
在這個軟件安全(quan)系列(lie)的第3部(bu)分(fen)中(zhong),我們(men)提到(dao)了軟件環(huan)境(jing)中(zhong)有關安全(quan)的幾個關鍵要(yao)(yao)素。設計正(zheng)確的流程來保(bao)證(zheng)您的網絡安全(quan)是(shi)(shi)(shi)很重要(yao)(yao)的。最(zui)后一個部(bu)分(fen)要(yao)(yao)討論的是(shi)(shi)(shi)主(zhu)入(ru)口(kou)。由于客(ke)戶可直接訪(fang)問主(zhu)入(ru)口(kou)——即應(ying)用本身,因此主(zhu)入(ru)口(kou)有時候(hou)是(shi)(shi)(shi)最(zui)薄(bo)弱的環(huan)節(jie)。
在(zai)這篇文章中,我(wo)(wo)們依舊(jiu)先從宏觀的角度切(qie)入(ru),再逐漸深(shen)入(ru)探討(tao)細(xi)節問題。首先我(wo)(wo)們會了(le)解一(yi)下(xia)基(ji)礎配(pei)置(zhi),接著(zhu)探討(tao)如何對輸入(ru)數據(ju)進行殺(sha)毒、檢查,最后我(wo)(wo)們會回顧(gu)一(yi)下(xia)優秀的成功案例,學習如何為您客戶(hu)的賬戶(hu)提供安全保(bao)障(zhang)。
SSL與安全
如(ru)今,SSL應該是(shi)web應用的(de)(de)(de)默(mo)認方案了。憑借SSL證(zheng)書,您(nin)(nin)可(ke)以對瀏(liu)(liu)覽器(qi)和基礎設施之間的(de)(de)(de)數據(ju)進行加密,這樣數據(ju)在(zai)互聯網(wang)上流動時就(jiu)不(bu)會被想(xiang)要監(jian)控(kong)流量(liang)的(de)(de)(de)人(ren)讀(du)取。新的(de)(de)(de)瀏(liu)(liu)覽器(qi)甚至會在(zai)您(nin)(nin)瀏(liu)(liu)覽未(wei)經SSL加密的(de)(de)(de)網(wang)站時發出警告。證(zheng)書的(de)(de)(de)獲取也(ye)比以往要容(rong)易得(de)(de)多,而且完全免費,只需(xu)要使用諸如(ru)Let’s Encrypt的(de)(de)(de)網(wang)站即可(ke)。或(huo)者(zhe),若您(nin)(nin)使用的(de)(de)(de)是(shi)AWS,您(nin)(nin)可(ke)以通過他們的(de)(de)(de)證(zheng)書管理(li)器(qi)在(zai)幾秒內獲得(de)(de)SSL證(zheng)書,同樣不(bu)需(xu)要支付任(ren)何費用。
不過有(you)一個方(fang)面您可能沒有(you)考慮(lv)過,那就是后端系(xi)統(tong)之間的數(shu)(shu)據傳輸安全。若(ruo)您配備了相(xiang)互通信的API,那么最好將這(zhe)部(bu)分數(shu)(shu)據也一并加密。這(zhe)樣(yang)即使應(ying)用(yong)是在內(nei)部(bu)網(wang)絡實現的,若(ruo)有(you)人想要訪問(wen)網(wang)絡,那他就必須投入(ru)更多的精(jing)力讀取數(shu)(shu)據。這(zhe)一點同樣(yang)適(shi)用(yong)于(yu)數(shu)(shu)據庫——內(nei)部(bu)API應(ying)該通過SSL與數(shu)(shu)據庫通信。
阻止跨站點腳本攻擊
當有人(ren)成(cheng)功在(zai)應(ying)用中注入(ru)代碼,然后該應(ying)用又運行了這段代碼時(shi),就會發(fa)生跨站點腳本攻(gong)擊。發(fa)生跨站點腳本攻(gong)擊時(shi),攻(gong)擊者(zhe)會獲(huo)得(de)對代碼的完全(quan)掌(zhang)控,并可(ke)以實施某些惡意(yi)行為。因此在(zai)接收(shou)用戶輸(shu)入(ru)時(shi),務必要對其進行“消毒(du)”。消毒(du)是接收(shou)輸(shu)入(ru),確(que)保(bao)輸(shu)入(ru)的數(shu)據(ju)不會在(zai)應(ying)用程(cheng)序中形成(cheng)漏洞的一個過程(cheng),通常意(yi)味著(zhu)某些字符會被跳過。
eBay是一個最好的(de)例子。過去,eBay允(yun)許腳本在(zai)其網(wang)站上運(yun)行,目的(de)是為賣家提供一種獨一無二的(de)使用體(ti)驗——但代價是他們的(de)客(ke)戶被迫暴露在(zai)風險之中。最終,eBay在(zai)眾人(ren)的(de)呼(hu)聲中做(zuo)出(chu)了正確的(de)選擇,移除了這(zhe)項特性。
阻止SQL注入攻擊
和(he)跨站點腳本(ben)攻(gong)(gong)擊(ji)類似,SQL注入攻(gong)(gong)擊(ji)發生(sheng)在(zai)通過(guo)惡(e)意輸(shu)入獲取(qu)數(shu)(shu)(shu)據(ju)庫(ku)訪問權限的時候。在(zai)數(shu)(shu)(shu)據(ju)庫(ku)中運行(xing)SQL語句(ju)時,有時會(hui)獲取(qu)用(yong)(yong)戶(hu)(hu)數(shu)(shu)(shu)據(ju)(譬如進行(xing)搜(sou)索(suo)時)。而掌握(wo)了SQL的攻(gong)(gong)擊(ji)者可(ke)(ke)以通過(guo)在(zai)文本(ben)和(he)其(qi)他字段中輸(shu)入SQL命(ming)令將系統(tong)和(he)數(shu)(shu)(shu)據(ju)暴露(lu)出(chu)來。這些(xie)命(ming)令可(ke)(ke)以返回(hui)敏感的用(yong)(yong)戶(hu)(hu)數(shu)(shu)(shu)據(ju),或者像這幅著名(ming)的XKCD漫(man)畫(hua)一樣,刪除某些(xie)表格。經驗告訴我們(men),不要(yao)相信用(yong)(yong)戶(hu)(hu)。
加密數據
顯而(er)(er)易見,敏感數(shu)據(ju)(ju)(ju)(ju)應(ying)該(gai)加密。也(ye)就是說,不要(yao)直(zhi)接(jie)將(jiang)數(shu)據(ju)(ju)(ju)(ju)原樣(yang)存(cun)儲(chu)在(zai)磁盤上,而(er)(er)要(yao)先(xian)將(jiang)數(shu)據(ju)(ju)(ju)(ju)轉換(huan)成(cheng)人類無(wu)法理解的形(xing)式后在(zai)儲(chu)存(cun)。如果(guo)需(xu)要(yao)將(jiang)數(shu)據(ju)(ju)(ju)(ju)重新(xin)轉換(huan)成(cheng)人類可以(yi)理解的形(xing)式,則需(xu)要(yao)使用密鑰(yao)。這樣(yang),若有人在(zai)沒有密鑰(yao)的情況下想要(yao)訪問數(shu)據(ju)(ju)(ju)(ju),只(zhi)能夠(gou)獲(huo)得一堆垃圾。無(wu)論是在(zai)哪里儲(chu)存(cun)數(shu)據(ju)(ju)(ju)(ju)(數(shu)據(ju)(ju)(ju)(ju)庫或設備(bei)文件中),都應(ying)該(gai)對數(shu)據(ju)(ju)(ju)(ju)進(jin)行(xing)加密。
不發送多余的數據
下面這(zhe)(zhe)個(ge)安全(quan)漏洞常常被人忽視:返回(hui)(hui)(hui)數(shu)(shu)(shu)據(ju)(ju)(ju)時(shi),應(ying)該(gai)問問自己:“應(ying)該(gai)發送(song)這(zhe)(zhe)部分數(shu)(shu)(shu)據(ju)(ju)(ju)嗎?”例如,若您的(de)API獲取了(le)(le)一(yi)整個(ge)用(yong)戶模型(xing),那么(me)返回(hui)(hui)(hui)這(zhe)(zhe)個(ge)模型(xing)有(you)大概率會是(shi)一(yi)個(ge)餿主意,因為這(zhe)(zhe)個(ge)模型(xing)可(ke)能包含了(le)(le)身份(fen)信息和敏感信息,而(er)這(zhe)(zhe)一(yi)點(dian)是(shi)可(ke)以(yi)避免(mian)的(de)。每一(yi)個(ge)API都應(ying)該(gai)限制返回(hui)(hui)(hui)數(shu)(shu)(shu)據(ju)(ju)(ju)的(de)范圍(wei),即只返回(hui)(hui)(hui)關聯性(xing)最(zui)強的(de)數(shu)(shu)(shu)據(ju)(ju)(ju)塊,因為一(yi)旦向瀏覽器發送(song)了(le)(le)數(shu)(shu)(shu)據(ju)(ju)(ju),這(zhe)(zhe)部分數(shu)(shu)(shu)據(ju)(ju)(ju)就(jiu)基本相當于暴露了(le)(le)。
雙因子認證提升安全性
在(zai)回(hui)顧一些(xie)成(cheng)功案例后,我們會探討還有哪些(xie)措施可以保(bao)證(zheng)(zheng)用(yong)(yong)戶(hu)數(shu)據的(de)(de)(de)(de)安(an)全。雙因子認(ren)證(zheng)(zheng)或(huo)多因子認(ren)證(zheng)(zheng)(MFA)是(shi)保(bao)護(hu)用(yong)(yong)戶(hu)賬戶(hu)安(an)全的(de)(de)(de)(de)常見做法(fa)之一。這(zhe)項(xiang)技術(shu)會在(zai)用(yong)(yong)戶(hu)輸入密碼后要求(qiu)用(yong)(yong)戶(hu)證(zheng)(zheng)明(ming)自(zi)己的(de)(de)(de)(de)身份。如(ru)果您有使用(yong)(yong)網上銀行應(ying)用(yong)(yong)程序的(de)(de)(de)(de)經驗(yan),那么您大(da)概率已經遇到(dao)過(guo)這(zhe)個機制了。用(yong)(yong)戶(hu)登錄后,這(zhe)項(xiang)技術(shu)會向用(yong)(yong)戶(hu)請求(qiu)建立一條(tiao)通道來獲取一個驗(yan)證(zheng)(zheng)碼——例如(ru):輸入文本,或(huo)者更理想的(de)(de)(de)(de)是(shi)使用(yong)(yong)像Authy這(zhe)樣(yang)的(de)(de)(de)(de)安(an)全應(ying)用(yong)(yong)程序。有了這(zhe)些(xie)工具后,用(yong)(yong)戶(hu)在(zai)登錄時就會被要求(qiu)提供一個一次性的(de)(de)(de)(de)驗(yan)證(zheng)(zheng)碼。這(zhe)樣(yang)即便用(yong)(yong)戶(hu)的(de)(de)(de)(de)密碼泄露,賬戶(hu)也不會被他人非法(fa)訪問。
在和登錄(lu)賬(zhang)戶(hu)有關的問題(ti)上,邏輯分(fen)析是(shi)(shi)(shi)一個(ge)很好的辦(ban)法。用(yong)(yong)(yong)(yong)戶(hu)是(shi)(shi)(shi)否在最近2秒內登錄(lu)失敗了15次(ci)?這些(xie)請求來源的IP地(di)址是(shi)(shi)(shi)否和其常(chang)規位置相去甚遠(yuan)?這些(xie)跡象都可能(neng)表(biao)明進行登錄(lu)操作的不是(shi)(shi)(shi)實(shi)際(ji)用(yong)(yong)(yong)(yong)戶(hu)本(ben)人。提示(shi)用(yong)(yong)(yong)(yong)戶(hu)進行登錄(lu)驗證,或者(zhe)在登錄(lu)發(fa)生時(shi)告知用(yong)(yong)(yong)(yong)戶(hu),都是(shi)(shi)(shi)保護用(yong)(yong)(yong)(yong)戶(hu)賬(zhang)戶(hu)安全的好辦(ban)法。
給密碼加鹽
保護用戶(hu)信(xin)息的另(ling)一(yi)種標(biao)準做法是在密碼(ma)中增加(jia)一(yi)個隨機(ji)生成(cheng)的字符串(又叫(jiao)“鹽值(zhi)”),然后(hou)再進行加(jia)密。采(cai)取這(zhe)種做法后(hou),即使用戶(hu)在您的應用程序和(he)其他應用程序上都使用相(xiang)同的密碼(ma)(順便說(shuo)一(yi)下(xia),這(zhe)種習慣很不好),您的應用程序也可保證儲存的信(xin)息的唯一(yi)性(xing)。
那么,為什么這(zhe)一點很重要(yao)呢?不(bu)妨(fang)考慮(lv)一下這(zhe)種情形:您的密碼(ma)在(zai)某個(ge)(ge)網站(zhan)被泄露了(le)(le)。此時,若其他網站(zhan)都引入了(le)(le)鹽值,那么這(zhe)個(ge)(ge)密碼(ma)就沒辦法(fa)(fa)被用(yong)于(yu)非法(fa)(fa)用(yong)途(tu)。實際上,對于(yu)加了(le)(le)鹽的密碼(ma)而言,即使(shi)您輸入的是和以前相同的密碼(ma),這(zhe)個(ge)(ge)密碼(ma)也(ye)不(bu)再是原來的密碼(ma)了(le)(le)。
小心第三方庫
在今(jin)天(tian)的環境中(zhong)很難再找到一(yi)款(kuan)沒有(you)使(shi)用(yong)(yong)第三方庫的應用(yong)(yong),任(ren)何(he)用(yong)(yong)戶都可以(yi)輕松使(shi)用(yong)(yong)開源庫中(zhong)的代(dai)(dai)碼(ma),而(er)這些(xie)代(dai)(dai)碼(ma)是允許所有(you)人自由(you)查(cha)看的。因此(ci),最好(hao)的辦法是在使(shi)用(yong)(yong)這些(xie)代(dai)(dai)碼(ma)以(yi)前檢查(cha)這些(xie)庫是否存在安(an)全漏洞。一(yi)個年代(dai)(dai)久遠又缺乏維護的庫有(you)大概率是不安(an)全的。
關于安全最后的一些想法
應(ying)用(yong)程(cheng)序(xu)(xu)是業務的(de)(de)(de)組成部分(fen),在(zai)某些情況下甚至是最關(guan)鍵的(de)(de)(de)部分(fen)。應(ying)用(yong)程(cheng)序(xu)(xu)是客(ke)戶(hu)與(yu)(yu)您互動的(de)(de)(de)橋(qiao)梁,也(ye)(ye)是您與(yu)(yu)同行拉(la)開差距(ju)的(de)(de)(de)手段,但在(zai)面對攻擊者和(he)用(yong)戶(hu)本身時(shi)也(ye)(ye)是最薄弱的(de)(de)(de)一環。遵循(xun)數(shu)據(ju)加(jia)密的(de)(de)(de)標準做法,為用(yong)戶(hu)提供數(shu)據(ju)保護的(de)(de)(de)選項,就是在(zai)為您的(de)(de)(de)業務爭(zheng)取最大的(de)(de)(de)機遇。
最后,安(an)全是團隊合作的(de)(de)產物,任(ren)何(he)人(ren)都不可(ke)能僅憑一己之力為(wei)您的(de)(de)企業和客戶提供安(an)全保(bao)障,安(an)全是公司從上到下每(mei)一個人(ren)的(de)(de)日常(chang)。您要(yao)在自己的(de)(de)企業內(nei)建立起(qi)這種習慣和氛(fen)圍。