安全軟件開(kāi)發(fā)入門(mén)
作者:cleverpig
軟件安全問(wèn)題有趣的《黑客帝國》終極解釋?zhuān)?/span>《黑客帝國》故事里面的人物關(guān)系,就像電腦里面的各種程序的關(guān)系一樣:
電腦里面的系統程序:Matrix;
病毒程序:以Neo為首的人類(lèi);
防病毒軟件:Agent特工、機器章魚(yú)、先知(迷惑和引導病毒程序的);
以及出錯程序:Smith和Merovingian。
第一集:病毒程序入侵Matrix,喚醒被隔離的病毒源代碼Neo,并通過(guò)破壞Agent特工這些防毒軟件取得控制部分機器系統的勝利。
第二集:講述Matrix系統通過(guò)蒙騙的方法將Neo等病毒代碼或受感染的程序收集引導到一個(gè)Zion區域,進(jìn)行殺毒,結果在片尾,病毒程序Neo意識到了這一點(diǎn)。
第三集:Matrix系統軟件通過(guò)利用Agent防病毒軟件和Smith出錯程序來(lái)對付Neo這些病毒程序,并且成功地消滅了這兩方,達到系統防御能力升級。
其實(shí)故事一開(kāi)頭就注定了Neo的悲劇結局和人類(lèi)的失敗。因為病毒如果最后導致系統崩潰,病毒也將被消滅。所以病毒要不被系統消滅,要不導致系統崩潰,和系統一起滅亡。
軟件安全問(wèn)題的根源:內因:軟件有錯誤
* 脆弱點(diǎn)
* 缺陷(設計層)
* Bug(實(shí)現層)
* 軟件開(kāi)發(fā)方法存在問(wèn)題
外因:軟件的運行環(huán)境
* 網(wǎng)絡(luò )對軟件的發(fā)展產(chǎn)生了巨大的影響(負面居多)
外部環(huán)境:黑客、惡意代碼
內部環(huán)境:誤操作、報復、經(jīng)濟犯罪
7+1的軟件安全問(wèn)題領(lǐng)域:1.輸入驗證和表示法
2.濫用API
3.安全特性
4.時(shí)間和狀態(tài)
5.錯誤處理
6.代碼質(zhì)量
7.封裝
*.環(huán)境
1.輸入驗證和表示法輸入驗證和表示問(wèn)題由元字符、替換編碼、數字表示法引起。如果選擇使用輸入驗證,那么就要使用白列表、而不是黑列表。
由于輕信輸入而造成的大問(wèn)題包括:緩沖區溢出、跨站腳本攻擊、SQL注入、緩存毒藥和其它腳本小子們非常輕易吃到的“低掛的果實(shí)”(這里只安全性較低的軟件設計)。
2.濫用APIAPI規定了調用者和被調用程序之間的使用約定。濫用API的常見(jiàn)模式是由調用者錯誤地信任被調用方造成的。例如,調用者希望從被調用程序那里返回獲取用戶(hù)信息,而被調用程序并沒(méi)有任何的安全性保證其信息的可靠性。于是調用者就假定了調用程序返回數據的正確性和安全性。當然,也存在“壞人”有意破壞調用者-調用程序之間約定的行為。
3.安全特性軟件安全不是安全軟件。世界上所有的加密算法都不能滿(mǎn)足真正的安全需要。盡管使用SSL保護網(wǎng)絡(luò )流量的手段,而認證、訪(fǎng)問(wèn)控制、機密性保障、加密算法、權限管理等都可能存在著(zhù)安全缺陷。
4.時(shí)間與狀態(tài)分布式計算與時(shí)間和狀態(tài)相關(guān)。為了使多個(gè)組件進(jìn)行通信,狀態(tài)必須在組件之間共享,而所有這些都需要花費時(shí)間。因此在時(shí)間和狀態(tài)之間可能存在著(zhù)巨大的、未發(fā)現的天然攻擊資源。
多數開(kāi)發(fā)者人格化了他們的工作(將程序看作“它”的單體)。他們自以為單一、全能的控制線(xiàn)程能夠孜孜不倦地日夜工作,以同一種方式支撐整個(gè)應用。而現代計算機在任務(wù)之間切換速度與日俱增,并且多核、多CPU或者分布式系統的應用使兩件事情完全可以在同一時(shí)間發(fā)生。因此缺陷便出現在開(kāi)發(fā)者所設想的程序執行模型和實(shí)際情況之間的差異中。這些缺陷與在線(xiàn)程、進(jìn)程、時(shí)間和信息之間的無(wú)法預期的交互相關(guān)。而這些交互往往通過(guò)共享狀態(tài)發(fā)生:信號、變量、文件系統、全局信息等。
5.錯誤處理如果想破壞軟件,那么就讓它拋出一下垃圾數據,并看看你導致了哪些錯誤。在現代面向對系統中,異常的想法取代了被禁止的goto概念。
與錯誤處理相關(guān)的安全缺陷在開(kāi)發(fā)中很常見(jiàn)。在A(yíng)PI被濫用的情況下,安全缺陷主要存在于兩種方式:第一,開(kāi)發(fā)者忘記處理錯誤或者粗略得處理錯誤;第二,在產(chǎn)生錯誤時(shí)要么給出過(guò)于詳細的信息,要么錯誤過(guò)于太具放射性以至于沒(méi)有可處理它們的方式。
6.代碼質(zhì)量安全是可靠性的子集。如果可以完整地描述你的系統和其存在的正面、負面的安全可能性,那么安全成為了可靠性的子集。劣質(zhì)代碼將導致無(wú)法預期的行為,從軟件使用者的觀(guān)點(diǎn),它將被認為是很差的可用性;而從攻擊者的視角看,糟糕的代碼將提供給系統施壓的可乘之機。
7.封裝封裝是指在事物之間的邊界和它們之間建立的界限。在web瀏覽器中,它確保了移動(dòng)代碼不能夠強行我們的硬盤(pán)攻擊。在web服務(wù)端,它意味著(zhù)在經(jīng)過(guò)認證的有效數據和私密數據之間的差別。這里的邊界非常重要,如今在類(lèi)之間的一些方法構成了重要的邊界,因此信任模式需要謹慎的設置。
8.環(huán)境這是上面七種領(lǐng)域的外部領(lǐng)域,它包括在代碼外部的所有東西,并對于我們建立的軟件安全同樣重要。
十大web安全問(wèn)題:1.未驗證輸入 問(wèn)題描述:web 請求信息在被Web應用使用之前都是未驗證的,攻擊者能夠利用其中的弱點(diǎn)攻擊服務(wù)器;攻擊者通過(guò)偽造HTTP請求的各個(gè)部分,例如URL,查詢(xún)字符串,頭,cookies,表單域,隱藏域等繞過(guò)站點(diǎn)的安全機制。
這些常見(jiàn)的偽造輸入攻擊通常包括:強制瀏覽,命令插入,跨站腳本,緩沖區溢出,格式化字符串,SQL注入,cookie中毒,隱藏域操作等等。
保護方法:過(guò)濾惡意輸入;客戶(hù)端輸入驗證、服務(wù)器端驗證。
2.破壞訪(fǎng)問(wèn)控制 問(wèn)題描述:對認證用戶(hù)能夠進(jìn)行的操作缺乏合理的限制。攻擊者利用其中的缺陷訪(fǎng)問(wèn)其他用戶(hù)的賬戶(hù),瀏覽敏感文件,或使用未授權的功能。
保護方法:
加強對會(huì )話(huà)的保護(會(huì )話(huà)ID);
防止暴力瀏覽繞過(guò)訪(fǎng)問(wèn)控制檢查;
合理設置訪(fǎng)問(wèn)權限;
禁止客戶(hù)端緩存。
3.破壞認證和會(huì )話(huà)管理 問(wèn)題描述:賬戶(hù)信用和會(huì )話(huà)令牌沒(méi)有被合理保護,攻擊者能夠危及密碼、密鑰、會(huì )話(huà)cookies或其他限制而冒用他人的賬戶(hù)
保護方法:
加強密碼強度;
限制登錄次數;
使用SSL保護傳輸中的認證信息;
使用SSL保護會(huì )話(huà)ID;
禁止客戶(hù)端緩存。
4.跨站腳本缺陷 問(wèn)題描述:web應用能被利用將攻擊轉送到端用戶(hù)的瀏覽器。成功的跨站攻擊能夠暴露用戶(hù)的會(huì )話(huà)令牌,攻擊本地計算機或者用虛假信息欺騙用戶(hù)。
保護方法:
對用戶(hù)提供的輸出進(jìn)行編碼;
根據白列表,嚴格驗證查詢(xún)字符串;
過(guò)濾、清除頁(yè)面請求中的活動(dòng)內容。
5.緩沖區溢出漏洞 問(wèn)題描述:Web應用組件可能存在緩沖區溢出漏洞,對它的攻擊會(huì )造成嚴重的攻擊后果。這種漏洞是由于CGI,庫函數,驅動(dòng)程序、應用服務(wù)器組件等沒(méi)有合理地驗證輸入。
保護方法:
密切跟蹤Web應用產(chǎn)品的最新錯誤報告,及時(shí)打補??;
使用漏洞掃描工具定期對系統進(jìn)行緩沖區溢出漏洞掃描;
嚴格審查Web應用程序中從用戶(hù)請求接收數據的代碼,確保對緩沖區長(cháng)度進(jìn)行了檢查。
6.注入缺陷 問(wèn)題描述:Web應用在訪(fǎng)問(wèn)外部系統或本地操作系統時(shí)需要傳遞參數,這些參數可能會(huì )被攻擊者利用嵌入惡意代碼,這樣導致外部系統能以應用服務(wù)器的權限執行系統命令。
保護方法:
避免使用外部解釋器;
對于涉及到的后臺數據庫調用,應對數據進(jìn)行嚴格驗證;
將Web應用程序設置為能滿(mǎn)足需要的最小權限運行;
不得不使用外部命令時(shí)進(jìn)行嚴格檢查;
應該檢查調用的所有輸出、返回代碼和錯誤代碼,最低限度要能確定何時(shí)發(fā)生了錯誤。
7.不合理的錯誤處理 問(wèn)題描述:正常操作中的錯誤條件沒(méi)能合理處理,如果攻擊者使Web應用產(chǎn)生未作處理的錯誤,就能得到具體系統信息,使安全機制失效,使服務(wù)器崩潰。
保護方法:
設計合理的錯誤處理策略并作好文檔,包括要處理的錯誤類(lèi)型、錯誤提示信息、日志需記錄的信息;
處理所有可能的錯誤,但不暴露不該暴露的細節;
遇到重復的錯誤嘗試時(shí)發(fā)出警告。
8.不安全存儲 問(wèn)題描述:Web應用經(jīng)常使用加密函數保護信息和身份證明,這些函數和保護其完整性的代碼很難完全正確地實(shí)現,從而導致弱保護問(wèn)題。
保護方法
除非必要,盡量少保存數據;
存儲密碼的摘要(例如SHA-1)而非加密的密碼;
必須使用加密算法時(shí),盡量采用公開(kāi)的密碼算法庫。并妥善存儲秘密信息,如密鑰、證書(shū)、密碼等。
9.拒絕服務(wù) 問(wèn)題描述:攻擊者能夠消耗Web應用的資源,使其無(wú)法正確為合法用戶(hù)服務(wù),或封閉用戶(hù)賬戶(hù)甚至使服務(wù)癱瘓。
保護方法:
限定分配給每個(gè)用戶(hù)最少量的資源;
限制每個(gè)合法用戶(hù)僅有一個(gè)連接,并采用適當的丟棄部分請求的策略;
避免非認證用戶(hù)對數據庫或其他關(guān)鍵資源的非必要訪(fǎng)問(wèn);
使用內容緩存的方法減少對數據庫的訪(fǎng)問(wèn)。
10.不安全配置管理 問(wèn)題描述:對服務(wù)器合理配置是實(shí)現安全性的重要因素,服務(wù)器通常都有損害安全性的不合理配置。
保護方法:
為特定服務(wù)器和Web服務(wù)器建立強化安全配置策略,關(guān)閉無(wú)用服務(wù),建立角色、權限和賬戶(hù),使用日志和告警措施;
始終維護服務(wù)器的安全配置,跟蹤最新安全漏洞,應用最新補丁,升級安全設置,定期漏洞掃描,定期進(jìn)行內部審查。
兩種安全模型:微軟的安全軟件開(kāi)發(fā)模型:1.安全開(kāi)發(fā)生命周期(SDL): SDL總計為四步:
第一步:安全教育,通過(guò)教育才能提高安全意識。 設計人員:學(xué)會(huì )分析威脅
開(kāi)發(fā)人員:跟蹤代碼中每字節數據、質(zhì)疑所有關(guān)于數據的假設
測試人員:關(guān)注數據的變化
第二步:設計階段,利用威脅建模技術(shù)建立系統模型。第三步:開(kāi)發(fā)階段,編碼與測試并行。第四步:發(fā)行與維護階段,使用標準的修復機制修復安全缺陷。2.威脅建模:威脅模型是一種基于安全的分析,有助于人們確定給產(chǎn)品造成的最高級別的安全風(fēng)險,以及攻擊是如何表現出來(lái)的。
其目標是確定需要緩和哪些威脅,如何來(lái)緩和這些威脅。
主要分為四個(gè)步驟:第一步:分解應用程序。使用DFD(數據流圖)或者UML(統一建模語(yǔ)言)描述威脅模型,作為分析應用程序的重要組成部分。對應用程序進(jìn)行形式化分解,自頂向下,逐層細化,在分解過(guò)程中關(guān)注過(guò)程之間的數據流。
例如:
第二步:確定系統面臨的威脅。按照“STRIDE”威脅模型:
S:身份欺騙(Spoofing identity),造成冒充合法用戶(hù)、服務(wù)器欺騙(DNS 欺騙,DNS緩存中毒)。
T:篡改數據(Tampering with data)。
R:否認(Repudiation)、。
I:信息泄露(Information disclosure)。
D:拒絕服務(wù)(Denial of service, DOS)。
E:特權提升(Elevation of privilege)。
第三步:威脅評估。按照“DREAD”算法為威脅分級,并建立攻擊樹(shù):
D:潛在的破壞性(damage potential)
R:再現性(reproducibility)
E:可利用性(exploitability)
A:受影響的用戶(hù)(affected users)
D:可發(fā)現性(discoverability)
例如:
Threat #1: 惡意用戶(hù)瀏覽網(wǎng)絡(luò )上的秘密工資數據
潛在的破壞性: 讀取他人的私密工資并不是開(kāi)玩笑的事?!L(fēng)險值為8
再現性:100%可再現?!L(fēng)險值為10
可利用性: 必須處于同一子網(wǎng)或者處于同一路由器下?!L(fēng)險值為7
受影響的用戶(hù): 每個(gè)人都將受到影響?!L(fēng)險值為10
可發(fā)現性: 讓我們假設它已經(jīng)發(fā)生?!L(fēng)險值為10
計算風(fēng)險DREAD: (8+10+7+10+10) / 5 = 9
攻擊樹(shù)描述了攻擊者利用系統漏洞破壞各組件,對威脅目標進(jìn)行攻擊所經(jīng)歷的決策過(guò)程。建立攻擊樹(shù)需要考慮的幾個(gè)方面:
安全威脅:潛在的事件,當攻擊有動(dòng)機并付諸實(shí)施時(shí),威脅轉變?yōu)楣羰录?br> 安全漏洞:系統中的弱點(diǎn)。
資源:受威脅(或攻擊)的目標。
例如:
對Threat #1的威脅描述表格:
Threat #1的攻擊樹(shù):
第四步:建立緩和方案,選擇適當的安全技術(shù)。接觸點(diǎn)開(kāi)發(fā)模型:根據有效性排列的接觸點(diǎn):
代碼審查(Code review)
架構風(fēng)險分析(Architectural risk analysis )
滲透測試(Penetration testing )
基于風(fēng)險的安全測試(Risk-based security tests )
濫用用例(Abuse cases )
安全需求(Security requirements )
安全操作(Security operations )
1.代碼審查代碼審查的目標是找到bug,架構風(fēng)險分析的目標是找到缺陷。在很多情況下,這兩個(gè)主要的接觸點(diǎn)的執行順序能夠交換。
靜態(tài)分析工具:
靜態(tài)分析工具在代碼中查找固定的模式或規則集合。
靜態(tài)分析工具的輸出仍然需要人為判斷。
錯報(false negatives)問(wèn)題,程序中含有bug但工具沒(méi)有報告。
誤報(false positives)問(wèn)題,工具報出的bugs程序中不存在。
動(dòng)態(tài)分析工具:
執行程序、錯誤注入。
二進(jìn)制分析:
反匯編和反編譯都是攻擊者最常用的黑客工具。
例如:Fortify Source Code Analysis Suite
2.架構風(fēng)險分析架構風(fēng)險分析的主要活動(dòng)是從適當的高度建立一個(gè)目標系統的視圖,避免“只見(jiàn)樹(shù)林不見(jiàn)森林”,提倡一頁(yè)紙的總覽, “forest-level”視圖。
例如:
在forest-level視圖中主要分析以下幾個(gè)方面:
威脅(誰(shuí)可能攻擊系統)、每一層環(huán)境中的風(fēng)險、每個(gè)組件和數據流中可能存在的漏洞、技術(shù)風(fēng)險可能造成的商業(yè)破壞、風(fēng)險被實(shí)現的可能性、任何在每一層能夠實(shí)現的可行對策、考慮整個(gè)系統范圍內的可用保護機制。
3.滲透測試滲透測試,針對系統威脅嘗試對系統進(jìn)行滲透,包括:積極(正向)測試,驗證軟件正常執行了規定的任務(wù);消極(負向)測試,安全測試人員必須深入研究安全風(fēng)險(可能由濫用用例和體系風(fēng)險驅動(dòng))以便確定系統在攻擊之下如何反應。
測試工具:
錯誤注入工具。
其他工具:Fortify Software, CANVAS。
攻擊者的工具包。
4.基于風(fēng)險的安全測試此測試旨在揭示可能的軟件風(fēng)險和潛在攻擊。
實(shí)施人員:
使用傳統方式的標準測試組織可以執行功能安全測試;
基于風(fēng)險的安全測試更依賴(lài)于專(zhuān)門(mén)技術(shù)和經(jīng)驗,而不是測試經(jīng)驗和安全經(jīng)驗;
教會(huì )測試專(zhuān)業(yè)人員學(xué)會(huì )在測試時(shí)如何象一個(gè)攻擊者一樣思考。
實(shí)施方式:
有源碼:白盒測試,靜態(tài)分析--發(fā)現程序中的錯誤;
根據基于對軟件體系深入的理解而進(jìn)行的風(fēng)險分析的結論,進(jìn)行白盒測試;
無(wú)源碼:黑盒測試,運行程序--惡意輸入。
5.濫用用例濫用用例指軟件開(kāi)發(fā)人員需要在正常特性之外思考軟件系統的固有特性,如可靠性、安全和性能。
實(shí)施方式:
對系統的異常行為必須事先有所預期;
象攻擊者一樣思考你的系統,利用“反需求”嘗試出錯點(diǎn)。
例如:你的系統有一個(gè)使用加密保護通過(guò)序列化將關(guān)鍵數據寫(xiě)到磁盤(pán)上的安全需求,與這個(gè)需求對應的反需求就是要確定當缺少加密的時(shí)候會(huì )發(fā)什么情況。
6.安全需求設計系統的安全需求。
7.安全操作注重配置管理的安全性,由于配置的改變是必然的,因此我們在開(kāi)發(fā)和維護過(guò)程中需要控制配置的改變,建立開(kāi)發(fā)活動(dòng)(程序、數據、文檔)的快照,驗證配置的任何修改,防止惡意修改配置。
常用工具:
Rational ClearCase,MS Visual SourceSafe等。
實(shí)用的安全Web開(kāi)發(fā)“藥方”規劃體系結構和設計解決方案時(shí):識別和評估威脅:使用威脅建模系統地識別威脅,而不是以任意的方式應用安全性。接著(zhù),根據攻擊或安全損害產(chǎn)生的風(fēng)險和可能造成的潛在損失,對威脅進(jìn)行評價(jià)。這樣就可以適當的次序對威脅進(jìn)行處理。
創(chuàng )建安全的設計:使用嘗試或檢驗過(guò)的設計原則。集中處理關(guān)鍵區域,在這些區域,方法正確是必須的,而且經(jīng)常會(huì )出現錯誤。這里將它們稱(chēng)為應用程序缺陷類(lèi)別。其中包括輸入驗證、身份驗證、授權、配置管理、敏感數據保護、會(huì )話(huà)管理、密碼系統、參數處理、異常管理和審核與日志記錄各項。要特別注意部署問(wèn)題,包括拓撲、網(wǎng)絡(luò )基礎設施、安全策略和步驟。
執行體系結構和設計復查:應用程序設計的復查與目標部署環(huán)境和相關(guān)的安全策略有關(guān)。需要考慮底層基礎設施層安全性(包括邊界網(wǎng)絡(luò )、防火墻、遠程應用程序服務(wù)器等)帶來(lái)的限制。使用應用程序缺陷類(lèi)別幫助我們對應用程序進(jìn)行分類(lèi),并分析適合于每個(gè)領(lǐng)域的方法。
進(jìn)行應用開(kāi)發(fā)時(shí):開(kāi)發(fā)工具的安全性:充分了解開(kāi)發(fā)工具(包括語(yǔ)言、虛擬機、IDE環(huán)境、引用的第三方工具包),最好選擇開(kāi)放源代碼的開(kāi)發(fā)工具,這樣以便仔細審核其安全性。檢查開(kāi)發(fā)工具是否提供了用戶(hù)和代碼安全模型,是否允許對用戶(hù)和代碼可以執行的操作進(jìn)行限制。如果開(kāi)發(fā)中涉及公開(kāi)對稱(chēng)和不對稱(chēng)的加密與解密、散列、隨機數生成、數字簽名支持等算法,最好選用可靠的公開(kāi)算法,避免自己炮制算法。
編寫(xiě)安全代碼庫:對程序集進(jìn)行數字簽名,使它們不能隨意改動(dòng)。通過(guò)遵守面向對象設計原理,減小程序集受攻擊面,然后使用代碼訪(fǎng)問(wèn)安全性,進(jìn)一步限制哪些代碼可以調用您的代碼。使用結構化的異常處理方法防止敏感信息蔓延到當前信任邊界之外,并開(kāi)發(fā)更加可靠的代碼。避免常規問(wèn)題,特別是輸入文件名和 URL 的問(wèn)題。
安全地處理異常:不要顯示內部系統或應用程序的詳細信息,如堆棧跟蹤、SQL 語(yǔ)句片斷等。確保這類(lèi)信息不被允許蔓延到最終用戶(hù)或當前信任邊界以外。在異常事件中安全地“失敗”,確保應用程序拒絕非法訪(fǎng)問(wèn),而且沒(méi)有停留在不安全的狀態(tài)下。不記錄敏感或私有數據,如密碼,以免造成危害。在記錄或報告異常時(shí),如果用戶(hù)的輸入包括在異常消息中,對其進(jìn)行驗證或清理。例如,如果返回一個(gè)HTML錯誤消息,那么應該對輸出進(jìn)行編碼,以避免腳本注入。
執行第三方代碼的安全復查:使用分析工具分析二進(jìn)制程序集,確保它們符合安全設計準則,并修復分析工具識別出的所有安全缺陷。復查具體的應用程序元素,包括 Web 頁(yè)面和控件、數據訪(fǎng)問(wèn)代碼、Web 服務(wù)、服務(wù)組件等。要特別注意 SQL 注入和跨站點(diǎn)腳本編寫(xiě)缺陷。
保證開(kāi)發(fā)人員工作站的安全性:使用一套方法保證工作站的安全性。保證帳戶(hù)、協(xié)議、端口、服務(wù)、共享、文件與目 錄和注冊表的安全。最重要的是,保持工作站具有當前最新的補丁與更新。例如如果在 Microsoft Windows_ XP 或 Windows 2000 上運行 Internet 信息服務(wù) (IIS),則運行IISLockdown。IISLockdown 應用安全的IIS配置,并安裝URLScan Internet 安全應用程序編程接口 (ISAPI) 篩選器,該篩選器用于檢測和拒絕潛在的惡意 HTTP 請求。
編寫(xiě)具有最低權限的代碼:可以限制代碼能夠執行的操作,這與運行該代碼所使用的帳戶(hù)無(wú)關(guān)。通過(guò)配置策略或編寫(xiě)代碼,可以使用代碼訪(fǎng)問(wèn)安全性控制來(lái)限制代碼允許被訪(fǎng)問(wèn)的資源和操作。如果代碼不需要訪(fǎng)問(wèn)某種資源或執行某種敏感操作,可以安全性配置/控制來(lái)確保代碼不會(huì )被授予這種權限。
防止SQL注入:使用數據訪(fǎng)問(wèn)的參數化存儲過(guò)程。使用參數要確保輸入值的類(lèi)型和長(cháng)度都 得到檢查。將參數視作安全文本值和數據庫內的不可執行代碼。如果不能使用存儲過(guò)程,也可以使用帶有參數的SQL語(yǔ)句。但不要通過(guò)連接SQL命令和輸入值來(lái)構建 SQL 語(yǔ)句。還要確保應用程序使用具有最低權限的數據庫登錄,以限制它在數據庫中的功能。
防止跨站點(diǎn)腳本編寫(xiě):對輸入類(lèi)型、長(cháng)度、格式和范圍進(jìn)行驗證,并對輸出進(jìn)行編碼。如果輸出包括輸入(包括 Web 輸入),則對輸出進(jìn)行編碼。例如,對窗體字段、查詢(xún)字符串參數、cookie等進(jìn)行編碼,以及對從無(wú)法確定其數據是安全的數據庫(特別是共享數據庫)中讀取的輸入進(jìn)行編碼。對需要以HTML返回客戶(hù)端的自由格式的輸入字段,對輸出進(jìn)行編碼,然后選擇性地清除在許可元素(如用于格式化的 <b> 或 標記)上的編碼。
管理機密:最好尋找避免存儲機密的替代方法。如果必須存儲它們,則不要在源代碼或配置文件中以明文的方式存儲。
安全地調用代碼接口:特別注意傳遞給接口和接口返回的參數,防止潛在的緩沖區溢出。驗證輸入和輸出字符串參數的長(cháng)度,檢查數組邊界,并特別小心文件路徑的長(cháng)度。
執行安全的輸入驗證:對輸入進(jìn)行限制、拒絕和清理,因為驗證已知有效類(lèi)型、模式和范圍的數據要比通過(guò)查找已知錯誤字符來(lái) 驗證數據容易得多。驗證數據的類(lèi)型、長(cháng)度、格式和范圍。對字符串輸入,請使用正則表達式。有時(shí)候可能需要對輸入進(jìn)行清理。一個(gè)例子是在對數據編碼后清理編碼元數據,以保證其安全性。
保證頁(yè)面訪(fǎng)問(wèn)身份驗證的安全性:安全地劃分Web站點(diǎn),隔離匿名用戶(hù)可以訪(fǎng)問(wèn)的公共可訪(fǎng)問(wèn)頁(yè)面和需要身份驗證訪(fǎng)問(wèn)的限制性頁(yè)面。使用安全套接字層 (SSL) 來(lái)保護窗體身份驗證憑據和窗體身份驗證 cookie。限制會(huì )話(huà)生存時(shí)間和確保身份驗證 cookie 只在 HTTPS 上傳輸。對身份驗證 cookie 加密,不要在客戶(hù)端計算機上保留它,也不要將其用于個(gè)性化目的;對個(gè)性化使用單獨的 cookie。
管理和維護系統時(shí):實(shí)現補丁管理:針對Microsoft平臺,那么可以使用 Microsoft Baseline Security Analyzer (MBSA) 檢查當前安裝可能漏掉的補丁和更新。定期運行該操作,保持服務(wù)器當前安裝有最新的補丁和更新。在應用補丁前,對服務(wù)器數據進(jìn)行備份;在將補丁安裝在生產(chǎn)服務(wù)器上之前,先在測試服務(wù)器上進(jìn)行測試。還要使用 Microsoft 提供的安全通知服務(wù),并訂閱通過(guò)電子郵件接收安全布告。針對Unix/Linux平臺,可以 訂閱有關(guān)漏洞及補丁的郵件列表,定期使用工具,檢查服務(wù)器上安裝的補丁是否與Unix/Linux廠(chǎng)商發(fā)布的最新補丁列表相一致。
保證Web服務(wù)器的安全性:針對Microsoft平臺上運行的IIS服務(wù),可以使用IISLockdown應用安全的IIS配置,并安裝URLScan Internet 安全應用程序編程接口 (ISAPI) 篩選器,該篩選器用于檢測和拒絕潛在的惡意 HTTP 請求。針對Unix/Linux平臺上運行的Apache服務(wù),可以采用選擇性訪(fǎng)問(wèn)控制(DAC)和強制性訪(fǎng)問(wèn)控制(MAC)的安全策略,或者安裝安全相關(guān)的modules。針對WebService常用的協(xié)議(如soap),可以使用 XML 加密以確保敏感數據保持其私有性。使用數字簽名保證消息的完整性,尤其重要的數據應使用SSL加密。最重要的是,保持服務(wù)器安裝了當前最新的補丁和更新,并使其按照最小權限運行。
保證數據庫服務(wù)器的安全性:應用一種常見(jiàn)方法評估帳戶(hù)、協(xié)議、端口、服務(wù)、共享、文件與目錄和注冊表。還要評估 SQL Server的安全設置,如身份驗證模式和審核配置。評估身份驗證方法和 SQL Server登錄、用戶(hù)與角色的使用。確保安裝最新的服務(wù)包,定期監測操作系統和 SQL Server 補丁與更新。
防止拒絕服務(wù)攻擊:確保加強了服務(wù)器上的 TCP/IP 堆棧配置,以應對如 SYN flood 這樣的攻擊。對web服務(wù)的配置做適當的修改以限制接受的 POST 請求的規模,并對請求的執行時(shí)間做出限制。
限制文件 I/O:可以配置代碼訪(fǎng)問(wèn)安全策略,以確保限制單個(gè)程序集或整個(gè) Web 應用程序只能訪(fǎng)問(wèn)文件系統。例如,通過(guò)配置運行在媒體信任級上的 Web 應用程序,可以防止應用程序訪(fǎng)問(wèn)其虛擬目錄層次結構以外的文件。同時(shí),通過(guò)為特定程序集授予受限的文件 I/O 權限,可以精確控制哪些文件可以被訪(fǎng)問(wèn)以及應該如何訪(fǎng)問(wèn)它們。
執行遠程管理:針對Microsoft平臺,其終端服務(wù)提供了一種專(zhuān)用的協(xié)議 (RDP)。它支持身份驗證,并可以提供加密。如果需要文件傳輸工具,可以從 Windows 2000 Server 資源包中安裝文件復制實(shí)用工具。建議不要使用 IIS Web 管理,如果運行 IISLockdown 該選項將被清除。應該考慮提供一個(gè)加密的通信通道,并使用 IPSec 限制可以用于遠程管理您的服務(wù)器的計算機。還應該限制管理帳戶(hù)的數量。針對Unix/Linux平臺,建議采用SSH進(jìn)行遠程管理,文件傳輸使用SFTP。
參考資源:Microsoft Corporation的《編寫(xiě)安全的代碼》第二版Gary McGraw編寫(xiě)的《Software Security: Building Security In》微軟Web安全解決方案一覽使用Yassp工具包安裝安全的Solaris系統微軟IIS Lockdown Tool