在這個軟件安全系列的第3部分中,我們提到了軟件環境中有關安全的幾個關鍵要素。設計正确的流程來保證您的網絡安全是很重要的。最後一個部分要讨論的是主入口。由于客戶可直接訪問主入口——即應用本身,因此主入口有時候是最薄弱的環節。

在這篇文章中,我們依舊先從宏觀的角度切入,再逐漸深入探讨細節問題。首先我們會了解一下基礎配置,接着探讨如何對輸入數據進行殺毒、檢查,最後我們會回顧一下優秀的成功案例,學習如何爲您客戶的賬戶提供安全保障。

SSL與安全

如今,SSL應該是web應用的默認方案了。憑借SSL證書,您可以對浏覽器和基礎設施之間的數據進行加密,這樣數據在互聯網上流動時就不會被想要監控流量的人讀取。新的浏覽器甚至會在您浏覽未經SSL加密的網站時發出警告。證書的獲取也比以往要容易得多,而且完全免費,隻需要使用諸如Let’s Encrypt的網站即可。或者,若您使用的是AWS,您可以通過他們的證書管理器在幾秒内獲得SSL證書,同樣不需要支付任何費用。

不過有一個方面您可能沒有考慮過,那就是後端系統之間的數據傳輸安全。若您配備了相互通信的API,那麽最好将這部分數據也一并加密。這樣即使應用是在内部網絡實現的,若有人想要訪問網絡,那他就必須投入更多的精力讀取數據。這一點同樣适用于數據庫——内部API應該通過SSL與數據庫通信。

阻止跨站點腳本攻擊

當有人成功在應用中注入代碼,然後該應用又運行了這段代碼時,就會發生跨站點腳本攻擊。發生跨站點腳本攻擊時,攻擊者會獲得對代碼的完全掌控,并可以實施某些惡意行爲。因此在接收用戶輸入時,務必要對其進行“消毒”。消毒是接收輸入,确保輸入的數據不會在應用程序中形成漏洞的一個過程,通常意味着某些字符會被跳過。

eBay是一個最好的例子。過去,eBay允許腳本在其網站上運行,目的是爲賣家提供一種獨一無二的使用體驗——但代價是他們的客戶被迫暴露在風險之中。最終,eBay在衆人的呼聲中做出了正确的選擇,移除了這項特性。

阻止SQL注入攻擊

和跨站點腳本攻擊類似,SQL注入攻擊發生在通過惡意輸入獲取數據庫訪問權限的時候。在數據庫中運行SQL語句時,有時會獲取用戶數據(譬如進行搜索時)。而掌握了SQL的攻擊者可以通過在文本和其他字段中輸入SQL命令将系統和數據暴露出來。這些命令可以返回敏感的用戶數據,或者像這幅著名的XKCD漫畫一樣,删除某些表格。經驗告訴我們,不要相信用戶。

加密數據

顯而易見,敏感數據應該加密。也就是說,不要直接将數據原樣存儲在磁盤上,而要先将數據轉換成人類無法理解的形式後在儲存。如果需要将數據重新轉換成人類可以理解的形式,則需要使用密鑰。這樣,若有人在沒有密鑰的情況下想要訪問數據,隻能夠獲得一堆垃圾。無論是在哪裏儲存數據(數據庫或設備文件中),都應該對數據進行加密。

不發送多餘的數據

下面這個安全漏洞常常被人忽視:返回數據時,應該問問自己:“應該發送這部分數據嗎?”例如,若您的API獲取了一整個用戶模型,那麽返回這個模型有大概率會是一個馊主意,因爲這個模型可能包含了身份信息和敏感信息,而這一點是可以避免的。每一個API都應該限制返回數據的範圍,即隻返回關聯性最強的數據塊,因爲一旦向浏覽器發送了數據,這部分數據就基本相當于暴露了。

雙因子認證提升安全性

在回顧一些成功案例後,我們會探讨還有哪些措施可以保證用戶數據的安全。雙因子認證或多因子認證(MFA)是保護用戶賬戶安全的常見做法之一。這項技術會在用戶輸入密碼後要求用戶證明自己的身份。如果您有使用網上銀行應用程序的經驗,那麽您大概率已經遇到過這個機制了。用戶登錄後,這項技術會向用戶請求建立一條通道來獲取一個驗證碼——例如:輸入文本,或者更理想的是使用像Authy這樣的安全應用程序。有了這些工具後,用戶在登錄時就會被要求提供一個一次性的驗證碼。這樣即便用戶的密碼洩露,賬戶也不會被他人非法訪問。

在和登錄賬戶有關的問題上,邏輯分析是一個很好的辦法。用戶是否在最近2秒内登錄失敗了15次?這些請求來源的IP地址是否和其常規位置相去甚遠?這些迹象都可能表明進行登錄操作的不是實際用戶本人。提示用戶進行登錄驗證,或者在登錄發生時告知用戶,都是保護用戶賬戶安全的好辦法。

給密碼加鹽

保護用戶信息的另一種标準做法是在密碼中增加一個随機生成的字符串(又叫“鹽值”),然後再進行加密。采取這種做法後,即使用戶在您的應用程序和其他應用程序上都使用相同的密碼(順便說一下,這種習慣很不好),您的應用程序也可保證儲存的信息的唯一性。

那麽,爲什麽這一點很重要呢?不妨考慮一下這種情形:您的密碼在某個網站被洩露了。此時,若其他網站都引入了鹽值,那麽這個密碼就沒辦法被用于非法用途。實際上,對于加了鹽的密碼而言,即使您輸入的是和以前相同的密碼,這個密碼也不再是原來的密碼了。

小心第三方庫

在今天的環境中很難再找到一款沒有使用第三方庫的應用,任何用戶都可以輕松使用開源庫中的代碼,而這些代碼是允許所有人自由查看的。因此,最好的辦法是在使用這些代碼以前檢查這些庫是否存在安全漏洞。一個年代久遠又缺乏維護的庫有大概率是不安全的。

關于安全最後的一些想法

應用程序是業務的組成部分,在某些情況下甚至是最關鍵的部分。應用程序是客戶與您互動的橋梁,也是您與同行拉開差距的手段,但在面對攻擊者和用戶本身時也是最薄弱的一環。遵循數據加密的标準做法,爲用戶提供數據保護的選項,就是在爲您的業務争取最大的機遇。

最後,安全是團隊合作的産物,任何人都不可能僅憑一己之力爲您的企業和客戶提供安全保障,安全是公司從上到下每一個人的日常。您要在自己的企業内建立起這種習慣和氛圍。