威脅途徑與軟件安全:保護應用安全
在(zài)這(zhè)個(gè)軟件安全系列的(de)第3部分中,我們提到(dào)了(le/liǎo)軟件環境中有關安全的(de)幾個(gè)關鍵要(yào / yāo)素。設計正确的(de)流程來(lái)保證您的(de)網絡安全是(shì)很重要(yào / yāo)的(de)。最後一(yī / yì /yí)個(gè)部分要(yào / yāo)讨論的(de)是(shì)主入口。由于(yú)客戶可直接訪問主入口——即應用本身,因此主入口有時(shí)候是(shì)最薄弱的(de)環節。
在(zài)這(zhè)篇文章中,我們依舊先從宏觀的(de)角度切入,再逐漸深入探讨細節問題。首先我們會了(le/liǎo)解一(yī / yì /yí)下基礎配置,接着探讨如何對輸入數據進行殺毒、檢查,最後我們會回顧一(yī / yì /yí)下優秀的(de)成功案例,學習如何爲(wéi / wèi)您客戶的(de)賬戶提供安全保障。
SSL與安全
如今,SSL應該是(shì)web應用的(de)默認方案了(le/liǎo)。憑借SSL證書,您可以(yǐ)對浏覽器和(hé / huò)基礎設施之(zhī)間的(de)數據進行加密,這(zhè)樣數據在(zài)互聯網上(shàng)流動時(shí)就(jiù)不(bù)會被想要(yào / yāo)監控流量的(de)人(rén)讀取。新的(de)浏覽器甚至會在(zài)您浏覽未經SSL加密的(de)網站時(shí)發出(chū)警告。證書的(de)獲取也(yě)比以(yǐ)往要(yào / yāo)容易得多,而(ér)且完全免費,隻需要(yào / yāo)使用諸如Let’s Encrypt的(de)網站即可。或者,若您使用的(de)是(shì)AWS,您可以(yǐ)通過他(tā)們的(de)證書管理器在(zài)幾秒内獲得SSL證書,同樣不(bù)需要(yào / yāo)支付任何費用。
不(bù)過有一(yī / yì /yí)個(gè)方面您可能沒有考慮過,那就(jiù)是(shì)後端系統之(zhī)間的(de)數據傳輸安全。若您配備了(le/liǎo)相互通信的(de)API,那麽最好将這(zhè)部分數據也(yě)一(yī / yì /yí)并加密。這(zhè)樣即使應用是(shì)在(zài)内部網絡實現的(de),若有人(rén)想要(yào / yāo)訪問網絡,那他(tā)就(jiù)必須投入更多的(de)精力讀取數據。這(zhè)一(yī / yì /yí)點同樣适用于(yú)數據庫——内部API應該通過SSL與數據庫通信。
阻止跨站點腳本攻擊
當有人(rén)成功在(zài)應用中注入代碼,然後該應用又運行了(le/liǎo)這(zhè)段代碼時(shí),就(jiù)會發生跨站點腳本攻擊。發生跨站點腳本攻擊時(shí),攻擊者會獲得對代碼的(de)完全掌控,并可以(yǐ)實施某些惡意行爲(wéi / wèi)。因此在(zài)接收用戶輸入時(shí),務必要(yào / yāo)對其進行“消毒”。消毒是(shì)接收輸入,确保輸入的(de)數據不(bù)會在(zài)應用程序中形成漏洞的(de)一(yī / yì /yí)個(gè)過程,通常意味着某些字符會被跳過。
eBay是(shì)一(yī / yì /yí)個(gè)最好的(de)例子(zǐ)。過去,eBay允許腳本在(zài)其網站上(shàng)運行,目的(de)是(shì)爲(wéi / wèi)賣家提供一(yī / yì /yí)種獨一(yī / yì /yí)無二的(de)使用體驗——但代價是(shì)他(tā)們的(de)客戶被迫暴露在(zài)風險之(zhī)中。最終,eBay在(zài)衆人(rén)的(de)呼聲中做出(chū)了(le/liǎo)正确的(de)選擇,移除了(le/liǎo)這(zhè)項特性。
阻止SQL注入攻擊
和(hé / huò)跨站點腳本攻擊類似,SQL注入攻擊發生在(zài)通過惡意輸入獲取數據庫訪問權限的(de)時(shí)候。在(zài)數據庫中運行SQL語句時(shí),有時(shí)會獲取用戶數據(譬如進行搜索時(shí))。而(ér)掌握了(le/liǎo)SQL的(de)攻擊者可以(yǐ)通過在(zài)文本和(hé / huò)其他(tā)字段中輸入SQL命令将系統和(hé / huò)數據暴露出(chū)來(lái)。這(zhè)些命令可以(yǐ)返回敏感的(de)用戶數據,或者像這(zhè)幅著名的(de)XKCD漫畫一(yī / yì /yí)樣,删除某些表格。經驗告訴我們,不(bù)要(yào / yāo)相信用戶。
加密數據
顯而(ér)易見,敏感數據應該加密。也(yě)就(jiù)是(shì)說(shuō),不(bù)要(yào / yāo)直接将數據原樣存儲在(zài)磁盤上(shàng),而(ér)要(yào / yāo)先将數據轉換成人(rén)類無法理解的(de)形式後在(zài)儲存。如果需要(yào / yāo)将數據重新轉換成人(rén)類可以(yǐ)理解的(de)形式,則需要(yào / yāo)使用密鑰。這(zhè)樣,若有人(rén)在(zài)沒有密鑰的(de)情況下想要(yào / yāo)訪問數據,隻能夠獲得一(yī / yì /yí)堆垃圾。無論是(shì)在(zài)哪裏儲存數據(數據庫或設備文件中),都應該對數據進行加密。
不(bù)發送多餘的(de)數據
下面這(zhè)個(gè)安全漏洞常常被人(rén)忽視:返回數據時(shí),應該問問自己:“應該發送這(zhè)部分數據嗎?”例如,若您的(de)API獲取了(le/liǎo)一(yī / yì /yí)整個(gè)用戶模型,那麽返回這(zhè)個(gè)模型有大(dà)概率會是(shì)一(yī / yì /yí)個(gè)馊主意,因爲(wéi / wèi)這(zhè)個(gè)模型可能包含了(le/liǎo)身份信息和(hé / huò)敏感信息,而(ér)這(zhè)一(yī / yì /yí)點是(shì)可以(yǐ)避免的(de)。每一(yī / yì /yí)個(gè)API都應該限制返回數據的(de)範圍,即隻返回關聯性最強的(de)數據塊,因爲(wéi / wèi)一(yī / yì /yí)旦向浏覽器發送了(le/liǎo)數據,這(zhè)部分數據就(jiù)基本相當于(yú)暴露了(le/liǎo)。
雙因子(zǐ)認證提升安全性
在(zài)回顧一(yī / yì /yí)些成功案例後,我們會探讨還有哪些措施可以(yǐ)保證用戶數據的(de)安全。雙因子(zǐ)認證或多因子(zǐ)認證(MFA)是(shì)保護用戶賬戶安全的(de)常見做法之(zhī)一(yī / yì /yí)。這(zhè)項技術會在(zài)用戶輸入密碼後要(yào / yāo)求用戶證明自己的(de)身份。如果您有使用網上(shàng)銀行應用程序的(de)經驗,那麽您大(dà)概率已經遇到(dào)過這(zhè)個(gè)機制了(le/liǎo)。用戶登錄後,這(zhè)項技術會向用戶請求建立一(yī / yì /yí)條通道(dào)來(lái)獲取一(yī / yì /yí)個(gè)驗證碼——例如:輸入文本,或者更理想的(de)是(shì)使用像Authy這(zhè)樣的(de)安全應用程序。有了(le/liǎo)這(zhè)些工具後,用戶在(zài)登錄時(shí)就(jiù)會被要(yào / yāo)求提供一(yī / yì /yí)個(gè)一(yī / yì /yí)次性的(de)驗證碼。這(zhè)樣即便用戶的(de)密碼洩露,賬戶也(yě)不(bù)會被他(tā)人(rén)非法訪問。
在(zài)和(hé / huò)登錄賬戶有關的(de)問題上(shàng),邏輯分析是(shì)一(yī / yì /yí)個(gè)很好的(de)辦法。用戶是(shì)否在(zài)最近2秒内登錄失敗了(le/liǎo)15次?這(zhè)些請求來(lái)源的(de)IP地(dì / de)址是(shì)否和(hé / huò)其常規位置相去甚遠?這(zhè)些迹象都可能表明進行登錄操作的(de)不(bù)是(shì)實際用戶本人(rén)。提示用戶進行登錄驗證,或者在(zài)登錄發生時(shí)告知用戶,都是(shì)保護用戶賬戶安全的(de)好辦法。
給密碼加鹽
保護用戶信息的(de)另一(yī / yì /yí)種标準做法是(shì)在(zài)密碼中增加一(yī / yì /yí)個(gè)随機生成的(de)字符串(又叫“鹽值”),然後再進行加密。采取這(zhè)種做法後,即使用戶在(zài)您的(de)應用程序和(hé / huò)其他(tā)應用程序上(shàng)都使用相同的(de)密碼(順便說(shuō)一(yī / yì /yí)下,這(zhè)種習慣很不(bù)好),您的(de)應用程序也(yě)可保證儲存的(de)信息的(de)唯一(yī / yì /yí)性。
那麽,爲(wéi / wèi)什麽這(zhè)一(yī / yì /yí)點很重要(yào / yāo)呢?不(bù)妨考慮一(yī / yì /yí)下這(zhè)種情形:您的(de)密碼在(zài)某個(gè)網站被洩露了(le/liǎo)。此時(shí),若其他(tā)網站都引入了(le/liǎo)鹽值,那麽這(zhè)個(gè)密碼就(jiù)沒辦法被用于(yú)非法用途。實際上(shàng),對于(yú)加了(le/liǎo)鹽的(de)密碼而(ér)言,即使您輸入的(de)是(shì)和(hé / huò)以(yǐ)前相同的(de)密碼,這(zhè)個(gè)密碼也(yě)不(bù)再是(shì)原來(lái)的(de)密碼了(le/liǎo)。
小心第三方庫
在(zài)今天的(de)環境中很難再找到(dào)一(yī / yì /yí)款沒有使用第三方庫的(de)應用,任何用戶都可以(yǐ)輕松使用開源庫中的(de)代碼,而(ér)這(zhè)些代碼是(shì)允許所有人(rén)自由查看的(de)。因此,最好的(de)辦法是(shì)在(zài)使用這(zhè)些代碼以(yǐ)前檢查這(zhè)些庫是(shì)否存在(zài)安全漏洞。一(yī / yì /yí)個(gè)年代久遠又缺乏維護的(de)庫有大(dà)概率是(shì)不(bù)安全的(de)。
關于(yú)安全最後的(de)一(yī / yì /yí)些想法
應用程序是(shì)業務的(de)組成部分,在(zài)某些情況下甚至是(shì)最關鍵的(de)部分。應用程序是(shì)客戶與您互動的(de)橋梁,也(yě)是(shì)您與同行拉開差距的(de)手段,但在(zài)面對攻擊者和(hé / huò)用戶本身時(shí)也(yě)是(shì)最薄弱的(de)一(yī / yì /yí)環。遵循數據加密的(de)标準做法,爲(wéi / wèi)用戶提供數據保護的(de)選項,就(jiù)是(shì)在(zài)爲(wéi / wèi)您的(de)業務争取最大(dà)的(de)機遇。
最後,安全是(shì)團隊合作的(de)産物,任何人(rén)都不(bù)可能僅憑一(yī / yì /yí)己之(zhī)力爲(wéi / wèi)您的(de)企業和(hé / huò)客戶提供安全保障,安全是(shì)公司從上(shàng)到(dào)下每一(yī / yì /yí)個(gè)人(rén)的(de)日常。您要(yào / yāo)在(zài)自己的(de)企業内建立起這(zhè)種習慣和(hé / huò)氛圍。