軟件開發:安全編碼的九個最佳方法(三)
充分利用攻擊模式
程序員可以使用攻擊模式來確認相關攻擊所針對的特定編碼缺陷,并確保這些缺陷不會出現在其代碼中。首先,程序員在考慮軟件的架構和執行環境后,需要決定哪些攻擊模式可行,哪些技術可用于實施攻擊該軟件。例如,對于一個運行在本地Linux上的C或 C++程序而言,緩沖區溢出攻擊模式就具備相關性,而對于一個運行在.NET平臺上的C#程序而言,緩沖區溢出攻擊模式就與之無關。根據需要避免的攻擊模式,程序員應當決定哪些構造不應當出現在其代碼中。
下面的例子展示了程序員如何利用攻擊模式:
攻擊模式:簡單的腳本注入
用于:避免跨站腳本漏洞
此模式有可能針對的代碼部分:即將輸出的數據發送到一個來自不可信源的用戶的代碼部分。
如何保護代碼避免遭受攻擊模式:如果沒有提前采取相應的反制措施(即,根據架構師的決策,在服務器和客戶端之間的聯結處,包括一個自包含的輸入驗證器/輸出過濾器),就應當實施類似于下面的反制措施:
1、將潛在的危險字符轉換成其HTML的對等物,以防止客戶端顯示有可能包含非法數據或臆造數據的不可信輸出,如由攻擊者插入的<script>標簽。這種轉換的例子包括“<”變成“<”,或者“>”變成“>”;自動執行這種轉換的第三方Java庫;JavaScript的escape()函數也可以執行類似的轉換。注意,需要謹慎管理這種轉換,以避免由更長的字符串替換單個字符成造成的潛在的緩沖區溢出漏洞。
2、實施一種輸入驗證過濾器,使其可以根據允許輸入的字符白名單對輸入進行過濾。
實施加密和哈希
程序員需要加密敏感數據(例如,密碼和會話ID),尤其是在不受信任的渠道(如互聯網)更要如此。無法保護敏感數據可能會導致攻擊(例如,會話劫持和跨站腳本攻擊),導致對應用程序和數據的未授權訪問。
加密功能在許多軟件中是一種重要的工具,這會確保保密性和完整性。有許多程序可以創建自己的加密功能,如果程序被破解,就會使軟件不安全。對程序員來說,沒有任何理由和借口允許加密功能發生故障,因為所有的主流語言都有其安全的、經審核的加密函數庫。使用這些庫比用戶自己開發這些功能要簡單得多。下面是關于算法的一些建議:
對Web應用程序使用傳輸層安全(TLS);
不使用MD5和安全哈希算法(SHA-1),而應當使用SHA-256/512 and SHA-3哈希;
不要使用DES(數據加密標準),而應使用AES(高級加密標準)或Triple DES;
程序員所開發的程序還應當允許在算法被破解時,能夠輕易地切換到另一種哈希和加密算法。
在部署之前禁用調試工具
核心轉儲僅能夠在測試期間才可作為一種診斷工具使用。應當在部署應用程序之前對應用程序進行配置,在應用程序的實際使用期間如果發生故障,能夠關閉其生成核心轉儲的能力。在程序發生故障時,不能使用核心轉儲功能,而應該在程序退出之前,由“例外事件處理程序”來將適當的數據發送到安全日志中。此外,如果有可能,應當將核心文件的大小配置為零(0)(例如,在UNIX中使用setrlimit或ulimit);這樣做可以進一步防止生成核心文件。
顯然,上述所謂的九大最佳方法,并非程序員編制健壯軟件的靈丹妙藥,但是只要其遵循這些方法,就可以極大減少程序遭受攻擊或數據泄露的可能性。