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