應(yīng)用開發(fā)安全指南(下)

1、應(yīng)用系統(tǒng)編碼安全

1.1基本代碼安全要求

1.1.1輸入驗(yàn)證

對(duì)函數(shù)入口參數(shù)的合法性和準(zhǔn)確性進(jìn)行檢查徽惋,具體如下:

l在B/S環(huán)境下锨推,應(yīng)進(jìn)行服務(wù)端的驗(yàn)證而不僅僅是客戶端的驗(yàn)證(例如基于Javascript的驗(yàn)證)赘理。通過在客戶端和服務(wù)器之間放置一個(gè)代理服務(wù)器宦言,可以很容易繞過客戶端驗(yàn)證。有了代理服務(wù)器商模,攻擊者可以在數(shù)據(jù)被客戶端“驗(yàn)證”后修改數(shù)據(jù)(與“中間人”攻擊類似)奠旺。

l在實(shí)際的校驗(yàn)中,輸入校驗(yàn)首先定義一個(gè)有效(可接受)的字符集施流,然后檢查每個(gè)數(shù)據(jù)的字符是否在有效范圍內(nèi)响疚。如果輸入中包含無效的字符,應(yīng)用程序應(yīng)該返回錯(cuò)誤頁面并說明輸入中包含無效字符瞪醋。這樣進(jìn)行驗(yàn)證的原因是定義無效的字符集比較困難忿晕,并且一些不應(yīng)該有效的字符通常不會(huì)被指出。

l另外银受,邊界檢查(例如字符串的最大長度)應(yīng)該在字符有效性檢查以前進(jìn)行践盼,邊界分析可以防止大多數(shù)緩沖區(qū)溢出漏洞。

l從環(huán)境變量獲得的數(shù)據(jù)也需要進(jìn)行驗(yàn)證蚓土,同時(shí)避免在環(huán)境變量中存放敏感數(shù)據(jù)(例如密碼)宏侍。

1.1.2SQL語句

如果應(yīng)用程序需要連接后端數(shù)據(jù)庫赖淤,使用存儲(chǔ)過程而不能在代碼中使用SQL

語句蜀漆,使用程序以外的嵌入在代碼中的SQL語句調(diào)用特別危險(xiǎn),難以防止攻擊

者使用輸入域或者配置文件(由應(yīng)用程序載入)來執(zhí)行嵌入式的SQL攻擊咱旱。當(dāng)然确丢,輸入驗(yàn)證有助于緩解這種風(fēng)險(xiǎn)。

1.1.3注釋代碼

當(dāng)應(yīng)用程序在實(shí)際環(huán)境中開始應(yīng)用時(shí)吐限,應(yīng)該刪除所有的注釋代碼鲜侥。注釋代碼

是用來調(diào)試或者測(cè)試的,它們不是最終應(yīng)用程序的一部分诸典。無論如何應(yīng)該在實(shí)際的環(huán)境中刪除它們以避免意外的執(zhí)行(一般注釋標(biāo)識(shí)被刪除后就無法激活休眠的代碼描函,但還是存在可能性的,所以強(qiáng)烈建議執(zhí)行這項(xiàng)工作)。

1.1.4錯(cuò)誤消息

所有為用戶顯示的錯(cuò)誤信息都不應(yīng)該暴露任何關(guān)于系統(tǒng)舀寓、網(wǎng)絡(luò)或應(yīng)用程序的

敏感信息胆数。如果可能,應(yīng)使用包含編號(hào)的一般的錯(cuò)誤信息互墓,這種信息不返回給訪問用戶必尼,只返回404錯(cuò)誤,如“發(fā)生了錯(cuò)誤(代碼1234)篡撵,請(qǐng)您與系統(tǒng)維護(hù)部門聯(lián)系判莉。

1.1.5URL內(nèi)容

對(duì)于Web應(yīng)用,不能在URL上暴露任何重要信息育谬,例如密碼券盅、服務(wù)器名稱、IP地址或者文件系統(tǒng)路徑(暴露了Web服務(wù)器的目錄結(jié)構(gòu))斑司,這些信息可以在攻擊時(shí)被使用渗饮。

1.1.6設(shè)置PATH變量

設(shè)置PATH為一個(gè)已知的值,而不是僅僅使用啟動(dòng)時(shí)的缺省值宿刮。攻擊者可

以在攻擊應(yīng)用程序時(shí)使用PATH變量互站,例如試圖執(zhí)行一個(gè)任意的程序,這些可

以應(yīng)用于大多數(shù)其他的語言僵缺。

1.1.7其他要求

1胡桃、禁止使用未經(jīng)授權(quán)和驗(yàn)證的代碼。

2磕潮、使用第三方代碼翠胰,應(yīng)對(duì)代碼安全性進(jìn)行評(píng)估和測(cè)試。

3自脯、測(cè)試用的“后門”之景,應(yīng)在發(fā)布版中去除。

4膏潮、規(guī)范代碼的格式锻狗。

5、規(guī)范變量焕参、函數(shù)的命名轻纪;

6、規(guī)范程序的書寫格式叠纷,確保程序的易讀性刻帚。

7、對(duì)代碼進(jìn)行版本控制涩嚣,確保代碼的可用性崇众。

8掂僵、防止程序員非授權(quán)修改代碼

9、對(duì)代碼的訪問權(quán)限進(jìn)行嚴(yán)格的權(quán)限控制顷歌;

1看峻、禁止在程序中添加隱藏“惡意”的代碼闰靴,防止與應(yīng)用系統(tǒng)相關(guān)的程序員對(duì)系統(tǒng)的非授權(quán)修改侄旬。

2、應(yīng)用系統(tǒng)不應(yīng)在程序或進(jìn)程中固化賬號(hào)和口令冬耿。

3坤塞、系統(tǒng)應(yīng)具備對(duì)口令猜測(cè)的防范機(jī)制和監(jiān)控手段冯勉。

4、避免應(yīng)用程序以錯(cuò)誤的順序運(yùn)行摹芙,或者防止出現(xiàn)故障時(shí)灼狰,后續(xù)程序以不正常的流程運(yùn)行。

5浮禾、采用正確的故障恢復(fù)程序交胚,確保正確處理數(shù)據(jù)。

6盈电、采取會(huì)話控制或批次控制蝴簇,確保更新前后數(shù)據(jù)文件的一致性,例如:檢查操作前后文件打開和關(guān)閉的數(shù)目是否一致匆帚。

7熬词、檢查執(zhí)行操作前后對(duì)象的差額是否正常,如:句柄處理吸重,堆棧等系統(tǒng)資源的占用與釋放等互拾。

10、嚴(yán)格驗(yàn)證系統(tǒng)生成的數(shù)據(jù)嚎幸。

11颜矿、在網(wǎng)絡(luò)傳輸過程中檢查下載/上傳的數(shù)據(jù)或軟件的完整性。

12嫉晶、檢查文件與記錄是否被篡改骑疆。例如通過計(jì)算哈希值(HASH)進(jìn)行對(duì)比。

13车遂、禁止私自講代碼上傳到互聯(lián)網(wǎng)封断。

1.2Web編程安全基本要求

1.2.1輸入檢查安全

1斯辰、限制用戶輸入HTML和Script(JavaScript舶担、VBScript)代碼。輸入惡意HTML或Script(JavaScript彬呻、VBScript)代碼可能會(huì)對(duì)其他瀏覽者造成混淆衣陶、欺騙或惡意破壞的結(jié)果柄瑰。

2、檢查用戶輸入數(shù)據(jù)的長度剪况。輸入超出限定長度的數(shù)據(jù)教沾,可能造成服務(wù)器端程序溢出。

3译断、防止用戶輸入特殊字符改變SQL語義授翻。輸入含特殊字符的字串,篡改SQL語句的語義孙咪,可能造成SQL查詢執(zhí)行不該執(zhí)行的操作堪唐,以此繞

4、過身份認(rèn)證獲取非法權(quán)限翎蹈、甚至對(duì)數(shù)據(jù)進(jìn)行破壞淮菠。

5、限制用戶能夠訪問的最頂層目錄荤堪。編寫對(duì)服務(wù)器端文件合陵、目錄操作的程序時(shí)應(yīng)該注意限定此類程序能夠訪問的最頂層目錄,防止用戶構(gòu)造輸入字串借助程序功能訪問服務(wù)器關(guān)鍵文件導(dǎo)致泄漏服務(wù)器敏感信息澄阳。

6拥知、對(duì)所有類型的用戶輸入都要做檢查,并嚴(yán)格限定什么是合法的用戶輸入碎赢,限定一個(gè)合法輸入的范圍举庶,同時(shí)過濾有可能造成危險(xiǎn)的特殊字符。

7揩抡、對(duì)不可信任域發(fā)送到可信任域的數(shù)據(jù)一定要進(jìn)行檢查户侥。

8、盡可能在服務(wù)器端完成用戶輸入檢查峦嗤,不能輕易相信客戶端腳本的檢查結(jié)果蕊唐。雖然客戶端的Script腳本能完成一部分的用戶輸入檢查功能,但這種檢查的結(jié)果是不可信任的烁设,攻擊者可以自己制作表單程序繞過客戶端腳本驗(yàn)證替梨,將非法數(shù)據(jù)提交到服務(wù)器。

9装黑、在輸入變?yōu)檩敵鰰r(shí)副瀑,也要對(duì)特殊字符做檢查和轉(zhuǎn)換。

1.2.2敏感數(shù)據(jù)的存放和傳遞安全

1恋谭、敏感數(shù)據(jù)不能存放在Web頁中糠睡。

2、不能把敏感的數(shù)據(jù)存儲(chǔ)在cookie疚颊、隱藏字段或者潛在地可能會(huì)被用戶修改的地方狈孔。

3信认、客戶端向服務(wù)器端提交敏感數(shù)據(jù)應(yīng)該經(jīng)過加密(例如使用SSL),盡量不能明文傳輸均抽。

4嫁赏、密碼等敏感信息存放在數(shù)據(jù)庫中應(yīng)該加密,并采用健壯的加密算法油挥。

5潦蝇、防止數(shù)據(jù)庫被攻破后泄漏用戶密碼。

6深寥、敏感數(shù)據(jù)需要脫敏顯示护蝶。

1.2.3緩沖區(qū)溢出安全

1、所有的輸入都必須進(jìn)行正確的有效性檢測(cè)翩迈。

2持灰、必須保證數(shù)組沒有越界,增加數(shù)組操作函數(shù)的邊界檢查负饲。

3堤魁、安全地使用字符串處理函數(shù),慎用有安全隱患的字符串處理函數(shù)

4返十、使用Format字符串的時(shí)候特別注意Unicode和ANSI的大小不一致的情

況妥泉。

5、注意字符串結(jié)束符的保護(hù)洞坑。

6盲链、仔細(xì)研究庫函數(shù)內(nèi)部的緩沖區(qū)分配,明確其限制迟杂。不能使用realpath()

等函數(shù)刽沾,如果功能需要必須使用時(shí),一定要檢查試圖規(guī)范化的路徑的長度排拷,確保其不長于MAXPATHLEN侧漓。

7、時(shí)刻進(jìn)行邊界檢查监氢。建議使用一些檢查工具:Purify布蔗、Stackguard等檢查代碼,保證沒有緩沖區(qū)溢出的問題浪腐。

1.2.4格式化字符串安全

1纵揍、使用固定的格式化字符串,或者來自可信源的格式化字符串议街。

2泽谨、要檢查并限定locale的請(qǐng)求為合法值。

3、不能將用戶輸入直接作為格式化字符傳給格式化函數(shù)隔盛。

1.2.5整數(shù)溢出安全

1、對(duì)于涉及到內(nèi)存分配大小的計(jì)算拾稳,要進(jìn)行仔細(xì)檢查吮炕,確保計(jì)算不會(huì)產(chǎn)生溢出。

2访得、對(duì)于涉及到數(shù)組索引的計(jì)算龙亲,要進(jìn)行仔細(xì)檢查,確保計(jì)算不會(huì)產(chǎn)生溢出悍抑。

3鳄炉、要使用無符號(hào)整數(shù)表示數(shù)組偏移和內(nèi)存分配大小。

1.2.6SQL注入代碼安全

1搜骡、要檢查輸入的有效性和可信度拂盯。

2、要使用參數(shù)化的查詢记靡、占位符谈竿、或者參數(shù)綁定來構(gòu)造SQL語句。

3摸吠、要在程序之外存儲(chǔ)數(shù)據(jù)庫的連接信息空凸,比如經(jīng)過保護(hù)的配置文件或者Windows注冊(cè)表。

4寸痢、即使使用的是存儲(chǔ)過程呀洲,也不能使用字符串連接來構(gòu)造SQL語句。

5啼止、不能在存儲(chǔ)過程內(nèi)部使用字符串連接來構(gòu)造SQL語句道逗。

6、不能在存儲(chǔ)過程內(nèi)部執(zhí)行不可信的參數(shù)献烦。

7憔辫、不能簡單地雙寫單引號(hào)或者雙引號(hào)。

8仿荆、不能使用高權(quán)限賬號(hào)連接數(shù)據(jù)庫贰您,比如sa或者root。

9拢操、不能在程序或者連接字符串中存儲(chǔ)登錄口令锦亦。

10、不能在Web根目錄下存儲(chǔ)數(shù)據(jù)庫配置信息令境。

11杠园、應(yīng)從數(shù)據(jù)庫中刪除對(duì)所有用戶自定義表的訪問權(quán)限,同時(shí)只對(duì)存儲(chǔ)過程授權(quán)舔庶,然后使用存儲(chǔ)過程以及參數(shù)化的查詢來構(gòu)造查詢字符串抛蚁。

1.2.7命令注入代碼安全

1陈醒、在輸入命令傳遞給命令處理程序之前要進(jìn)行驗(yàn)證。

2瞧甩、如果輸入驗(yàn)證失敗钉跷,要安全地處理失敗信息。

3肚逸、不能向任何命令解釋器傳遞未驗(yàn)證的輸入信息爷辙,即使這些輸入僅僅是數(shù)據(jù)信息。

4朦促、避免使用正則表達(dá)式來進(jìn)行輸入驗(yàn)證膝晾,應(yīng)手工去寫一些簡單而又清晰的驗(yàn)證代碼。

1.2.8異常處理代碼安全

1务冕、要檢測(cè)每個(gè)安全相關(guān)函數(shù)的返回值血当。

2、對(duì)于每一個(gè)更改用戶設(shè)定或者及其設(shè)定的函數(shù)禀忆,都要檢查其返回值歹颓。

3、要有從錯(cuò)誤條件中進(jìn)行恢復(fù)的考慮油湖,避免拒絕服務(wù)攻擊巍扛。

4、不能一次性處理所有的異常乏德,要將異常情況進(jìn)行分類處理撤奸,避免在異常處理代碼中的漏洞發(fā)生。

1.2.9跨站腳本代碼安全

1喊括、要對(duì)所有基于Web的輸入進(jìn)行輸入驗(yàn)證和可信度驗(yàn)證胧瓜。

2、在沒有驗(yàn)證合法性之前郑什,不能對(duì)基于Web的輸入進(jìn)行回顯府喳。

3、不能在cookie中存儲(chǔ)敏感數(shù)據(jù)蘑拯。

1.2.10保護(hù)網(wǎng)絡(luò)流量的代碼安全

1钝满、要使用強(qiáng)大的初始認(rèn)證機(jī)制。

2申窘、對(duì)應(yīng)用程序所產(chǎn)生的所有網(wǎng)絡(luò)流量都要執(zhí)行過程中消息認(rèn)證弯蚜。

3、盡可能使用SSL/TLS進(jìn)行網(wǎng)絡(luò)加密傳輸剃法。

1.2.11.應(yīng)用中的弱口令代碼安全

1碎捺、確保口令在網(wǎng)絡(luò)上認(rèn)證時(shí)不被竊聽。

2收厨、要在登錄失敗時(shí)給出錯(cuò)誤提示晋柱,并記錄失敗口令嘗試。

3诵叁、盡可能使用基于hash強(qiáng)壯的單向加密函數(shù)進(jìn)行口令存儲(chǔ)雁竞。

4、為用戶更改口令提供安全的機(jī)制黎休。

5浓领、不得使用默認(rèn)賬號(hào)和默認(rèn)口令玉凯,若使用势腮,必須在首次登錄后進(jìn)行修改。

6漫仆、不得在程序捎拯、后臺(tái)存儲(chǔ)明文的口令。

7盲厌、口令要有一定的強(qiáng)度署照,應(yīng)當(dāng)滿足系統(tǒng)的賬號(hào)口令策略要求。

1.2.12SOCKET網(wǎng)絡(luò)編程安全基本要求

1吗浩、在socket函數(shù)調(diào)用時(shí)建芙,明確參數(shù)中綁定的端口、IP地址和網(wǎng)卡接懂扼。Windows環(huán)境下禁荸,在遇到多個(gè)網(wǎng)卡的情況時(shí),需要通過注冊(cè)表來獲得網(wǎng)卡接口和IP地址的信息阀湿,包括WindowsNT和windows2008赶熟。

2、判斷連接的合法身份陷嘴。即映砖,為防止惡意的連接以及可能是無效的連接,建議在socket連接期間灾挨,判斷連接的對(duì)端是否是合法的真正的連接邑退。

3、對(duì)于UDP連接劳澄,可以獲得連接對(duì)方的IP地址和端口瓜饥,從而可以判斷對(duì)方的有效性和合法性;對(duì)于TCP連接浴骂,由于每次連接需要三次握手乓土,而且還有超時(shí)機(jī)制,存在兩種方式來控制。

4趣苏、對(duì)于TCP連接狡相,需要盡量在三次握手完成前完成判斷,同時(shí)防止端口掃描的攻擊食磕。

5尽棕、盡可能確保socket應(yīng)用能通過合理設(shè)置的防火墻。

6彬伦、在可能的情況下滔悉,盡量減少socket連接數(shù)目。

7单绑、盡量不能使用回?fù)艿募夹g(shù)回官。

8、盡量采用有連接狀態(tài)的協(xié)議搂橙,例如TCP協(xié)議歉提。由于防火墻一般采取禁止一切的策略,對(duì)于UDP協(xié)議比較難以設(shè)置区转。

9苔巨、在一個(gè)應(yīng)用程序中,盡量使用同一種協(xié)議废离,不能使用多種協(xié)議侄泽。

10、盡量將客戶端和服務(wù)器端的端口做成可以配置,不能硬編碼在程序中。

1.3JAVA安全開發(fā)要求

JAVA語言安全規(guī)范參考OWASPTOP10要求踪古,本指南列舉了常見的

JAVA開發(fā)安全要求。

1.3.1防范跨站腳本(XSS)

跨站腳本是最普遍的Web應(yīng)用安全漏洞诀豁。當(dāng)應(yīng)用程序在發(fā)送給瀏覽器的頁面中包含用戶提供的數(shù)據(jù),但沒有經(jīng)過適當(dāng)驗(yàn)證或轉(zhuǎn)譯窥妇,就容易導(dǎo)致跨站腳本漏洞舷胜。

攻擊者能在受害者瀏覽器中執(zhí)行腳本以劫持用戶會(huì)話、危害網(wǎng)站活翩、插入惡意內(nèi)容和重定向用戶等烹骨。

已知三種著名跨站漏洞是:1)存儲(chǔ)式;2)反射式材泄;3)基于DOM沮焕。

反射式跨站腳本通過測(cè)試或代碼分析很容易找到。

防范措施:

1拉宗、驗(yàn)證輸入

檢查每個(gè)輸入的有效性峦树,主要檢查輸入類型和數(shù)據(jù)的長度辣辫。

2、編碼輸出

對(duì)驗(yàn)證輸入的另一面就是編碼輸出魁巩。編碼輸出是指確保字符被視為數(shù)據(jù)急灭,而不是作為HTML元字符被瀏覽器解析。這些技術(shù)定義一些特殊的“轉(zhuǎn)義”字符谷遂,沒有正確轉(zhuǎn)義的數(shù)據(jù)它仍然會(huì)在瀏覽器中正確解析葬馋。編碼輸出只是讓瀏覽器知道數(shù)據(jù)是不是要被解析,達(dá)到攻擊無法實(shí)現(xiàn)的目的肾扰。需要編碼的部分:HTML實(shí)體畴嘶、HTML屬性、JavaScript集晚、CSS窗悯、URL。

1.3.2防范SQL注入

簡單來說甩恼,注入往往是應(yīng)用程序缺少對(duì)輸入進(jìn)行安全性檢查所引起的蟀瞧,攻擊者把一些包含指令的數(shù)據(jù)發(fā)送給解釋器沉颂,解釋器把收到的數(shù)據(jù)轉(zhuǎn)換成指令執(zhí)行条摸。注入漏洞十分普遍,通常能在SQL查詢铸屉、LDAP查詢钉蒲、Xpath查詢、OS命令彻坛、程序參數(shù)等中出現(xiàn)顷啼。

注入能導(dǎo)致數(shù)據(jù)丟失或數(shù)據(jù)破壞、缺乏可審計(jì)性或是拒絕服務(wù)昌屉,注入漏洞有時(shí)甚至能導(dǎo)致完全接管主機(jī)钙蒙。

SQL注入包含了SQL注入、XPATH注入间驮、LDAP注入躬厌、OS命令注入等。

1.3.3防范惡意文件執(zhí)行

惡意文件執(zhí)行是一種能夠威脅任何網(wǎng)站形式的漏洞竞帽,只要攻擊者在具有引入(include)功能程式的參數(shù)中修改參數(shù)內(nèi)容扛施,Web服務(wù)器便會(huì)引入惡意程序從而受到惡意文件執(zhí)行漏洞攻擊。

攻擊者可利用惡意文件執(zhí)行漏洞進(jìn)行攻擊取得Web服務(wù)器控制權(quán)屹篓,進(jìn)行不法利益或獲取經(jīng)濟(jì)利益疙渣。

1.3.4不安全的直接對(duì)象引用

所謂“不安全的對(duì)象直接引用”,即Insecure direct object references堆巧,意指一個(gè)已經(jīng)授權(quán)的用戶妄荔,通過更改訪問時(shí)的一個(gè)參數(shù)泼菌,從而訪問到原本其并沒有得到授權(quán)的對(duì)象。Web應(yīng)用往往在生成Web頁面時(shí)會(huì)用它的真實(shí)名字啦租,且并不會(huì)對(duì)所有的目標(biāo)對(duì)象訪問時(shí)檢查用戶權(quán)限灶轰,所以這就造成了不安全的對(duì)象直接引用的漏洞。以下是不安全的對(duì)象直接引用示例:

l攻擊者發(fā)現(xiàn)他自己的參數(shù)是6065刷钢,即?acct=6065笋颤;

l他可以直接更改參數(shù)為6066,即?acct=6066内地;

l這樣他就可以直接看到6066用戶的賬戶信息了伴澄;

l這種漏洞能損害參數(shù)所引用的所有數(shù)據(jù)。除非名字空間很稀疏阱缓,否則攻擊者很容易訪問該類型的所有數(shù)據(jù)非凌。

1.3.5防范跨站請(qǐng)求偽造

跨站請(qǐng)求偽造,也被稱成為“one-click attack”或者session riding荆针,通吵ㄎ耍縮寫為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利用航背。它與XSS非常不同喉悴,并且攻擊方式幾乎相左。XSS利用站點(diǎn)內(nèi)的信任用戶玖媚,而CSRF則通過偽裝來自受信任用戶的請(qǐng)求來利用受信任的網(wǎng)站箕肃。與XSS攻擊相比,CSRF攻擊往往不太流行(因此對(duì)其進(jìn)行防范的資源也相當(dāng)稀少)和難以防范今魔,所以被認(rèn)為比XSS更具危險(xiǎn)性勺像。

攻擊者能讓受害用戶修改可以修改的任何數(shù)據(jù),或者是執(zhí)行允許使用的任何功能错森。

1.3.6信息泄露和錯(cuò)誤處理不當(dāng)

應(yīng)用程序常常產(chǎn)生錯(cuò)誤信息并顯示給使用者吟宦。很多時(shí)候,這些錯(cuò)誤信息非常有用涩维,因?yàn)樗鼈兘沂緦?shí)施細(xì)則或有用的開發(fā)信息殃姓。泄露太多的細(xì)節(jié)(如錯(cuò)誤堆棧跟蹤信息、SQL語句等等)激挪;

?登錄失敗后辰狡,通知用戶是否用戶ID或密碼出錯(cuò)——登錄失敗可能是由于ID或密碼錯(cuò)誤造成的。這為一個(gè)對(duì)關(guān)鍵資產(chǎn)發(fā)動(dòng)蠻力攻擊的攻擊者提供重要信息垄分。

1.3.7殘缺的認(rèn)證和會(huì)話管理

與認(rèn)證和會(huì)話管理相關(guān)的應(yīng)用程序功能往往得不到正確實(shí)施宛篇,這就導(dǎo)致攻擊者破壞密碼、密鑰薄湿、會(huì)話令牌或利用實(shí)施漏洞冒充其他用戶身份叫倍。

這些漏洞可能導(dǎo)致部分甚至全部賬號(hào)遭受攻擊偷卧。一旦攻擊成功,攻擊者能執(zhí)行合法用戶的任何操作吆倦,因此特權(quán)賬號(hào)會(huì)造成更大的破壞听诸。

編程要求:

l使用內(nèi)置的會(huì)話管理功能;

l通過認(rèn)證的問候蚕泽;

l使用單一的入口點(diǎn)晌梨;

l確保在一開始登錄SSL保護(hù)的網(wǎng)頁;

l獲取注銷的權(quán)利须妻;

l添加超時(shí)仔蝌;

l確保你使用的是安全相關(guān)的功能;

l使用強(qiáng)大的認(rèn)證荒吏;

l不進(jìn)行默認(rèn)身份驗(yàn)證敛惊。

1.3.8不安全的加密存儲(chǔ)

保護(hù)敏感數(shù)據(jù)已經(jīng)成為網(wǎng)絡(luò)應(yīng)用的最重要的組成部分,加密的敏感數(shù)據(jù)已是非常常見安全保護(hù)手段绰更。不加密的應(yīng)用程序瞧挤、設(shè)計(jì)不當(dāng)或者使用不恰當(dāng)?shù)拿艽a技術(shù)等可能導(dǎo)致披露敏感數(shù)據(jù)。

l攻擊者能夠取得或是篡改機(jī)密的或是私有的信息儡湾;

l攻擊者通過機(jī)密秘密的竊取從而進(jìn)行進(jìn)一步的攻擊特恬;

l造成企業(yè)形象破損,用戶滿意度下降盒粮,甚至面臨法律訴訟等鸵鸥。編程要求:

l驗(yàn)證你的結(jié)構(gòu)奠滑;

l識(shí)別所有的敏感數(shù)據(jù)丹皱;

l識(shí)別敏感數(shù)據(jù)存放的所有位置;

l確保所應(yīng)用的威脅模型能夠應(yīng)付這些攻擊宋税;

l使用加密手段來應(yīng)對(duì)威脅摊崭;

l使用一定的機(jī)制來進(jìn)行保護(hù)

l文件加密;

l數(shù)據(jù)庫加密杰赛;

l數(shù)據(jù)元素加密呢簸;

l正確的使用這些機(jī)制;

l使用標(biāo)準(zhǔn)的強(qiáng)算法乏屯;

l合理的生成根时,分發(fā)和保護(hù)密鑰;

l準(zhǔn)備密鑰的變更辰晕;

l驗(yàn)證實(shí)現(xiàn)方法蛤迎;

l確保所有的證書、密鑰和密碼都得到了安全的存放含友;

l有一個(gè)安全的密鑰分發(fā)和應(yīng)急處理的方案替裆。

1.3.9不安全的通信

對(duì)于不加密的應(yīng)用程序的網(wǎng)絡(luò)信息傳輸校辩,需要保護(hù)敏感的通信。加密(通常SSL)必須用于所有身份驗(yàn)證的連接辆童,特別是通過Internet訪問的網(wǎng)頁宜咒,以及后端的連接。否則把鉴,應(yīng)用程序?qū)⒈┞渡矸蒡?yàn)證或會(huì)話令牌故黑。

l攻擊者能夠取得或是篡改機(jī)密的或是私有的信息;

l攻擊者通過這些秘密的竊取從而進(jìn)行進(jìn)一步的攻擊庭砍;

l造成企業(yè)形象破損倍阐,用戶滿意度下降,甚至面臨法律訴訟等逗威。

l編程要求:

l提供合理的保護(hù)機(jī)制峰搪;

l對(duì)于敏感數(shù)據(jù)的傳輸,對(duì)所有連接都要使用TLS凯旭;

l在傳輸前對(duì)單個(gè)數(shù)據(jù)都要進(jìn)行加密概耻;(如XML-Encryption);

l在傳輸前對(duì)信息進(jìn)行簽名罐呼;(如XML-Signature)鞠柄;

l正確的使用這些機(jī)制;

l使用標(biāo)準(zhǔn)的強(qiáng)算法嫉柴;

l合理管理密鑰和證書厌杜;

l在使用前驗(yàn)證SSL證書。

1.3.10限制URL訪問失效

這個(gè)漏洞事實(shí)上也是與認(rèn)證相關(guān)的计螺,與我們前面提到的不安全的直接對(duì)象引用也是類似的夯尽,不同在于這個(gè)漏洞是指系統(tǒng)已經(jīng)對(duì)URL的訪問做了限制,但這種限制卻實(shí)際并沒有生效登馒。常見的錯(cuò)誤是匙握,我們?cè)谟脩粽J(rèn)證后只顯示給用戶認(rèn)證過的頁面和菜單選項(xiàng),而實(shí)際上這些僅僅是表示層的訪問控制而不能真正生效陈轿,攻擊者能夠很容易偽造請(qǐng)求直接訪問未被授權(quán)的頁面圈纺。

編程要求:

l如果URL不是公開的,那么必須限制能夠訪問的授權(quán)用戶麦射;

l加強(qiáng)基于用戶或角色的訪問控制蛾娶;

l完全禁止訪問未被授權(quán)的頁面類型(如配置文件、日志文件潜秋、源文件等)蛔琅;

l驗(yàn)證你的構(gòu)架;

l在每一個(gè)層次都使用簡單肯定的模型半等;

l確保每一層都有一個(gè)訪問機(jī)制揍愁;

l驗(yàn)證你的實(shí)現(xiàn)呐萨;

l不能使用自動(dòng)化的分析工具;

l確保每個(gè)URL都被外部過濾器或其他機(jī)制保護(hù)莽囤;

l確保服務(wù)器的配置不允許對(duì)非授權(quán)頁面的訪問谬擦。

1.4PHP安全開發(fā)要求

1.4.1變量濫用

PHP-4.1.0發(fā)布的時(shí)候建議關(guān)閉register_globals,并提供了7個(gè)特殊的數(shù)組變量來使用各種變量朽缎。對(duì)于從GET惨远、POST、COOKIE等來的變量并不會(huì)直接注冊(cè)成變量话肖,必需通過數(shù)組變量來存取北秽。PHP-4.2.0發(fā)布的時(shí)候,php.ini默認(rèn)配置就是register_globals=Off最筒。這使得程序使用PHP自身初始化的默認(rèn)值贺氓,一般為0,避免了攻擊者控制判斷變量床蜘。通過以下解決方法實(shí)現(xiàn):

配置文件php.ini設(shè)置register_globals=Off辙培。

要求程序員對(duì)作為判斷的變量在程序最開始初始化一個(gè)值。

1.4.2文件打開

如非特殊需要邢锯,把php的文件操作限制在Web目錄里面扬蕊。以下是修改apache配置文件httpd.conf的一個(gè)例子:

php_admin_valueopen_basedir/usr/local/apache/htdocs

重啟apache后,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的文件了丹擎,否則PHP就會(huì)報(bào)錯(cuò):

Warning:open_basedirrestrictionineffect.Fileisinwrongdirectoryinxxxonlinexx.

使用safe_mode模式也能避免這種問題尾抑,前面已經(jīng)討論過。

1.4.3文件包含

要求程序員包含文件里的參數(shù)盡量不能使用變量蒂培,如果使用變量再愈,就一定要嚴(yán)格檢查要包含的文件名,絕對(duì)不能由用戶任意指定毁渗。如前面文件打開中限PHP操作路徑是一個(gè)必要的選項(xiàng)践磅。另外,如非特殊需要灸异,一定要關(guān)閉PHP的遠(yuǎn)程文件打開功能。修改php.ini文件:

allow_url_fopen=Off

重啟apache羔飞。

1.4.4文件上傳

PHP-4.0.3以后提供了is_uploaded_file和move_uploaded_file函數(shù)肺樟,可以檢查操作的文件是否是用戶上傳的文件,從而避免把系統(tǒng)文件拷貝到Web目錄逻淌。

使用$HTTP_POST_FILES或$_FILES數(shù)組來讀取用戶上傳的文件變量么伯。嚴(yán)格檢查上傳變量。比如不允許是php腳本文件卡儒。把PHP腳本操作限制在Web目錄可以避免程序員使用copy函數(shù)把系統(tǒng)文件拷貝到Web目錄田柔。move_uploaded_file不受open_basedir的限制俐巴,所以不必修改php.ini里upload_tmp_dir的值。把PHP腳本用phpencode進(jìn)行加密硬爆,避免由于copy操作泄漏源碼欣舵。嚴(yán)格配置文件和目錄的權(quán)限,只允許上傳的目錄能夠讓nobody用戶可寫缀磕。

對(duì)于上傳目錄去掉PHP解釋功能缘圈,可以通過修改httpd.conf實(shí)現(xiàn):

php_flagengineoff

#如果是php3換成php3_engineoff

重啟apache,upload目錄的php文件就不能被apache解釋了袜蚕,即使上傳了php文件也沒有問題糟把,只能直接顯示源碼。

1.4.5命令執(zhí)行

解決方法:

要求程序員使用escapeshellcmd()函數(shù)過濾用戶輸入的shell命令牲剃。啟用safe_mode可以杜絕很多執(zhí)行命令的問題遣疯,不過要注意PHP的版本一定要是最新的,小于PHP-4.2.2的都可能繞過safe_mode的限制去執(zhí)行命令凿傅。

變量類型缺陷邏輯比較時(shí)注意變量類型另锋。

必要的時(shí)候使用"===",那么連變量類型一起比較狭归。

1.4.6警告及錯(cuò)誤信息

修改php.ini中關(guān)于Errorhandlingandlogging部分內(nèi)容:

error_reporting=E_ALLdisplay_errors=Offlog_errors=Onerror_log=/usr/local/apache/logs/php_error.log

然后重啟apache夭坪,注意文件/usr/local/apache/logs/php_error.log,必需可

以讓nobody用戶可寫过椎。

1.4.7PHP與MySQL組合的SQL注入

解決方法:

要求程序員對(duì)所有用戶提交的要放到SQL語句的變量進(jìn)行過濾室梅。

即使是數(shù)字類型的字段,變量也要用單引號(hào)擴(kuò)起來疚宇,MySQL自己會(huì)把字串處理成數(shù)字亡鼠。

在MySQL里不能給PHP程序高級(jí)別權(quán)限的用戶,只允許對(duì)自己的庫進(jìn)行操作敷待。

1.4.8跨站腳本

解決方法:

確認(rèn)輸入

strip_tags()

htmlspecialchars()

清除危險(xiǎn)的插入點(diǎn)间涵。

1.4.9禁用無用的函數(shù)

如果覺得有些函數(shù)還有威脅,可以設(shè)置php.ini里的disable_functions(這個(gè)選項(xiàng)不能在httpd.conf里設(shè)置)榜揖,比如:disable_functions=phpinfo,get_cfg_var

可以指定多個(gè)函數(shù)勾哩,用逗號(hào)分開。重啟apache后举哟,phpinfo,get_cfg_var函數(shù)都被禁止了思劳。建議關(guān)閉函數(shù)phpinfo,get_cfg_var,這兩個(gè)函數(shù)容易泄漏服務(wù)器信息妨猩,而且沒有實(shí)際用處潜叛。

1.4.10禁用某些類

這個(gè)選項(xiàng)是從PHP-4.3.2開始才有的,它可以禁用某些類,如果有多個(gè)用逗號(hào)分隔類名威兜。disable_classes也不能在httpd.conf里設(shè)置销斟,只能在php.ini配置文件里修改。

1.4.11限制腳本操作路徑

前面分析例程的時(shí)候也多次提到用open_basedir對(duì)腳本操作路徑進(jìn)行限制椒舵,這里再介紹一下它的特性蚂踊。用open_basedir指定的限制實(shí)際上是前綴,不是目錄名逮栅。也就是說"open_basedir=/dir/incl"也會(huì)允許訪問"/dir/include"和"/dir/incls"悴势,如果它們存在的話。如果要將訪問限制在僅為指定的目錄措伐,用斜線結(jié)束路徑名特纤。例如:"open_basedir=/dir/incl/"。

可以設(shè)置多個(gè)目錄侥加,在Windows中捧存,用分號(hào)分隔目錄。在任何其它系統(tǒng)中用冒號(hào)分隔目錄担败。作為Apache模塊時(shí)昔穴,父目錄中的open_basedir路徑自動(dòng)被繼承。

1.4.12其他安全配置

1提前、取消其它用戶對(duì)常用吗货、重要系統(tǒng)命令的讀寫執(zhí)行權(quán)限

?一般管理員維護(hù)只需一個(gè)普通用戶和管理用戶箱蟆,除了這兩個(gè)用戶肩民,給其它用戶能夠執(zhí)行和訪問的東西應(yīng)該越少越好艘儒,所以取消其它用戶對(duì)常用翻诉、重要系統(tǒng)命令的讀寫執(zhí)行權(quán)限能在程序或者服務(wù)出現(xiàn)漏洞的時(shí)候給攻擊者帶來很大的迷惑。記住一定要連讀的權(quán)限也去掉比伏,否則在linux下可以用/lib/ld-linux.so.2/bin/ls這種方式來執(zhí)行俭厚。

?如果要取消程序如果是在chroot環(huán)境里瑟曲,這個(gè)工作比較容易實(shí)現(xiàn)士鸥,否則闲孤,這項(xiàng)工作還是有些挑戰(zhàn)的。因?yàn)槿∠恍┏绦虻膱?zhí)行權(quán)限會(huì)導(dǎo)致一些服務(wù)運(yùn)行不正常烤礁。PHP的mail函數(shù)需要/bin/sh去調(diào)用sendmail發(fā)信讼积,所以/bin/bash的執(zhí)行權(quán)限不能去掉。

2鸽凶、去掉apache日志其它用戶的讀權(quán)限:

apache的access-log給一些出現(xiàn)本地包含漏洞的程序提供了方便之門币砂。通過提交包含PHP代碼的URL,可以使access-log包含PHP代碼玻侥,那么把包含文件指向access-log就可以執(zhí)行那些PHP代碼,從而獲得本地訪問權(quán)限亿蒸;

?如果有其它虛擬主機(jī)凑兰,也應(yīng)該相應(yīng)去掉該日志文件其它用戶的讀權(quán)限掌桩;

?當(dāng)然,如果你按照前面介紹的配置PHP那么一般已經(jīng)是無法讀取日志文件了姑食。

3波岛、保持運(yùn)行環(huán)境干凈。

4音半、不能在Web目錄放測(cè)試文件则拷。

1.5C/C++安全開發(fā)要求

C本質(zhì)上是不安全的編程語言。例如如果不謹(jǐn)慎使用的話曹鸠,其大多數(shù)標(biāo)準(zhǔn)的字符串庫函數(shù)有可能被用來進(jìn)行緩沖區(qū)攻擊或者格式字符串攻擊煌茬。但是,由于其靈活性彻桃、快速和相對(duì)容易掌握坛善,它是一個(gè)廣泛使用的編程語言。下面是針對(duì)開發(fā)安全的C語言程序的一些規(guī)范邻眷。

1.5.1緩沖區(qū)溢出

避免使用不執(zhí)行邊界檢查的字符串函數(shù)眠屎,因?yàn)樗鼈兛赡鼙挥脕磉M(jìn)行緩沖區(qū)溢出攻擊。下面是應(yīng)該避免使用的函數(shù)肆饶。同時(shí)改衩,也列出了每個(gè)函數(shù)相應(yīng)的比較安全的替換方式。

?不使用strcpy()驯镊,使用strncpy()葫督;

?不使用strcat(),使用strncat()阿宅;

?不使用sprintf()候衍,使用snprintf();

?不使用gets()洒放,使用fgets()蛉鹿。

在上面的前三個(gè)中函數(shù)中,每個(gè)替代函數(shù)的“n”表示了使用的緩沖區(qū)的大小往湿。最后一個(gè)函數(shù)的“f”妖异,表示格式,它允許用戶指定期望的輸入的格式领追。這些替換方程強(qiáng)制程序員定義使用的緩沖區(qū)的尺寸以及確定輸入的類型他膳。

1.5.2格式化字符串攻擊

該類攻擊往往與緩沖區(qū)溢出相關(guān),因?yàn)樗鼈冎饕昧四承┖瘮?shù)的假設(shè)绒窑,例如sprintf()和vsprintf()假設(shè)緩沖區(qū)的長度是無限的棕孙。然而即使使用snprintf()替換sprintf()也無法完全保護(hù)程序不受格式化字符串的攻擊。這些攻擊通過直接將格式說明符(formatspecifiers)(%d,%s蟀俊,%n等)傳遞到輸出函數(shù)接收緩沖區(qū)來進(jìn)行钦铺。

例如,以下的代碼就是不安全的snprintf(buffer,sizeof(buffer),string)這種情況下肢预,可以在字符串中插入格式說明符來操縱內(nèi)存的棧矛洞,來寫入攻擊者的數(shù)據(jù)(這些數(shù)據(jù)中包含小的程序代碼,并可由處理器接著執(zhí)行)烫映。對(duì)以上的例子建議使用下面的代碼沼本。

snprintf(buffer,sizeof(buffer),“%s”,string)進(jìn)行格式字符串攻擊不太容易。首先攻擊者必須能獲得內(nèi)存棧的內(nèi)容情況(或者從應(yīng)用導(dǎo)出或者使用調(diào)試器)锭沟,然后必須知道如何精確訪問特定的內(nèi)存空間來操縱棧中的變量抽兆。

執(zhí)行外部程序推薦使用exec()函數(shù)而不是system()函數(shù)來執(zhí)行外部程序。這是因?yàn)閟ystem()接收整個(gè)命令行的隨機(jī)的緩沖區(qū)來執(zhí)行程序冈钦。

snprintf(buffer,sizeof(buffer),"emacs%s",filename);

system(buffer);

在以上的例子中郊丛,可以通過使用分號(hào)利用文件名變量在sehll中插入額外的命令(例如文件名可以是/etc/hosts;rm*,這將在顯示/etc/hosts目錄文件的同時(shí)瞧筛,刪除目錄中的所有文件)厉熟。而exec()函數(shù)只保證第一個(gè)參數(shù)被執(zhí)行:

execl("usr/bin/emacs","usr/bin/emacs",filename,NULL);

上面的例子保證文件名僅僅作為一個(gè)參數(shù)輸入Emacs工具,同樣它在Emacs命令中使用完全的路徑而不是使用可以被攻擊者利用的PATH環(huán)境變量较幌。

1.5.3競(jìng)爭條件

進(jìn)程需要訪問資源時(shí)(無論是磁盤揍瑟、內(nèi)存或是文件)通常需要執(zhí)行兩個(gè)步驟:

1、首先測(cè)試資源是否空閑可用乍炉;

2绢片、如果可用,就訪問該資源岛琼,否則它等到資源不再使用為止再去訪問它底循。當(dāng)另一個(gè)進(jìn)程在步驟1和2之間想要訪問同一個(gè)資源時(shí)就出現(xiàn)問題了。

這會(huì)導(dǎo)致不可預(yù)測(cè)的結(jié)果槐瑞。進(jìn)程可能會(huì)被鎖定熙涤,或者一個(gè)進(jìn)程劫持獲得了另一個(gè)進(jìn)程的較大的權(quán)限而導(dǎo)致安全問題。攻擊主要集中在有較大權(quán)限的程序上(稱為setuid程序)困檩。競(jìng)爭條件攻擊通常利用程序執(zhí)行時(shí)可以訪問到的資源祠挫。另外權(quán)限低的程序也存在安全風(fēng)險(xiǎn),因?yàn)楣粽呖赡軙?huì)等待有較高權(quán)限的用戶執(zhí)行那個(gè)程序(例如root)悼沿,然后進(jìn)行攻擊等舔。

下面的建議有助于緩解競(jìng)爭條件(racecondition)攻擊:

在進(jìn)行文件操作時(shí),利用那些使用文件描述符的函數(shù)而不能使用那些使用文件路徑的函數(shù)(例如使用fdopen()而不能使用fopen())糟趾。文件描述符使得惡意的用戶在文件打開時(shí)或是在原始的進(jìn)程對(duì)文件進(jìn)行操作前慌植,無法使用文件連接(符號(hào)式的或是物理的)來改變文件甚牲。

在寫文件甚至在讀文件時(shí)使用fcntl()和flock()函數(shù)來對(duì)文件加鎖,這樣它們就不能被其他進(jìn)程訪問涤浇。它幾乎可以建立原子級(jí)的操作鳖藕。

謹(jǐn)慎操縱臨時(shí)文件魔慷,因?yàn)樗鶗?huì)導(dǎo)致競(jìng)爭條件只锭。

1.5.4檢驗(yàn)有效的返回值

檢驗(yàn)有效的返回值非常重要。一個(gè)例子是舊的/bin/login的實(shí)現(xiàn)中不檢驗(yàn)錯(cuò)誤的返回值院尔,導(dǎo)致當(dāng)它找不到/etc/passwd文件時(shí)返回root的訪問權(quán)限蜻展。如果該文件損壞了,那么這種情況是合理的邀摆,但如果該文件存在只是無法訪問纵顾,那么這就是一個(gè)大問題。

1.6Perl安全開發(fā)要求

多年以來栋盹,Perl已經(jīng)成為用于系統(tǒng)管理和WebCGI開發(fā)的功能最強(qiáng)的編程語言之一(幾乎可以使用Perl做任何功能的程序)施逾。但其擴(kuò)展應(yīng)用,即作為Internet上CGI的開發(fā)工具例获,使得它經(jīng)常成為Web服務(wù)器上的攻擊目標(biāo)汉额。

另外,大多數(shù)CGI腳本有著比一般用戶更高的權(quán)限榨汤,導(dǎo)致它更容易受攻擊蠕搜。下面列舉了一些開發(fā)者(特別是CGI程序員)可以使用的主動(dòng)的預(yù)防性的措施來增強(qiáng)Perl代碼的整體安全性(請(qǐng)注意:這不是Web服務(wù)器CGI腳本安全性的指導(dǎo)原則)。

1.6.1Taint驗(yàn)證

Perl版本5.x包含一個(gè)叫做TaintChecking的數(shù)據(jù)驗(yàn)證措施收壕。如果起用該功能妓灌,將不允許通過用戶輸入(任何程序外的輸入)來操縱其他的外部程序(例如通過管道將數(shù)據(jù)導(dǎo)入另一個(gè)程序執(zhí)行))。一般而言蜜宪,程序員不能信任輸入腳本和程序的數(shù)據(jù)(叫做Tainted數(shù)據(jù))虫埂,因?yàn)闊o法保證它不會(huì)產(chǎn)生危害(有意或者無意的)。Taint驗(yàn)證可以通過在命令行參數(shù)加入“-T”來開啟圃验。

例如:你可以在Perl腳本的第一行這樣加入“-T”:

#!usr/bin/perl5-T

Tainted數(shù)據(jù)包括命令行參數(shù)掉伏、環(huán)境變量和來自文件的數(shù)據(jù)。引用tainted

數(shù)據(jù)的變量也稱為tainted數(shù)據(jù)损谦。如果腳本試圖通過不安全的方式來使用tainted數(shù)據(jù)會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤(對(duì)這種情況稱為“不安全的依賴”(Insecuredependency)或者其他的說法)岖免。啟用tainted驗(yàn)證在有些情況下會(huì)導(dǎo)致腳本停止運(yùn)行,常常是由于Perl解釋器要求所有腳本引用的外部程序的完全路徑必須在PATH環(huán)境變量中列出照捡,同時(shí)PATH中包含的每個(gè)目錄除了目錄的所有者及相應(yīng)的所有者用戶組外無法修改颅湘。Taint驗(yàn)證對(duì)于環(huán)境比較敏感,但是只要可能的話栗精,應(yīng)該使用taint驗(yàn)證闯参,特別是代碼執(zhí)行其他程序功能時(shí)(例如在CGI腳本的情況下)瞻鹏。

1.6.2安全模塊

如果不但輸入數(shù)據(jù)不可信而且實(shí)際的代碼也不可信,例如用戶從網(wǎng)站上下載了一個(gè)ActiveX控件鹿寨,而它實(shí)際是一個(gè)特洛伊木馬(Trojanhorse)新博。這種情況下taint驗(yàn)證就不起作用。安全模塊讓程序員可以在Perl腳本中將不同的代碼模塊與安全對(duì)象聯(lián)系脚草。每個(gè)安全對(duì)象對(duì)于運(yùn)行的每塊代碼建立了一個(gè)限制的環(huán)境赫悄。這與chroot在一個(gè)進(jìn)程中只能在整體目錄結(jié)構(gòu)的一個(gè)子目錄中運(yùn)行類似。而saft對(duì)象限制perl代碼只能在perl包結(jié)構(gòu)的某些特定包中運(yùn)行馏慨。如何使用安全模式超出了本文的范圍埂淮,但是程序員應(yīng)該在任何時(shí)候盡量使用這一功能。

1.6.3警告參數(shù)

使用-w參數(shù)可以在Perl解釋腳本時(shí)顯示所有的警告信息写隶。警告可以在以下情況產(chǎn)生:只使用了一次的變量或者完全沒有使用過得變量倔撞,未定義的文件句柄,未關(guān)閉的文件句柄慕趴,或者將非數(shù)值變量傳遞到數(shù)據(jù)變量痪蝇。該功能不是針對(duì)安全處理的,但是可以有助于調(diào)試直接或者間接對(duì)安全有危害的錯(cuò)誤冕房。一般推薦總是使用-w參數(shù)躏啰。可以在taint驗(yàn)證時(shí)在第一行這樣使用-w參數(shù):

#!usr/bin/perl5-Tw

2毒费、應(yīng)用系統(tǒng)測(cè)試安全

應(yīng)用系統(tǒng)在正式上線前應(yīng)對(duì)安全性進(jìn)行測(cè)試丙唧,驗(yàn)證應(yīng)用系統(tǒng)的安全性是否符合安全設(shè)計(jì)及安全需求,應(yīng)用系統(tǒng)的安全測(cè)試包括以下內(nèi)容:

2.1測(cè)試前的要求

測(cè)試之前觅玻,首先要確定測(cè)試大綱想际,在測(cè)試大綱中應(yīng)當(dāng)明確應(yīng)用安全方面的測(cè)試內(nèi)容、手段及方案(即測(cè)試用例)溪厘。包括:

l安全性測(cè)試的環(huán)境要求胡本;

l安全性測(cè)試軟件、測(cè)試設(shè)備要求畸悬;

l安全性測(cè)試人員要求侧甫;

l安全性測(cè)試的時(shí)間要求;

l安全性測(cè)試的內(nèi)容蹋宦;

l安全性測(cè)試的輸入數(shù)據(jù)披粟;?安全性測(cè)試的預(yù)期結(jié)果;

l安全性測(cè)試的詳細(xì)過程冷冗;

l安全性測(cè)試的風(fēng)險(xiǎn)和風(fēng)險(xiǎn)規(guī)避方案守屉。

測(cè)試大綱中安全性方面的描述是進(jìn)行安全性測(cè)試的一個(gè)重要依據(jù)。大綱內(nèi)容的編寫應(yīng)當(dāng)依據(jù)應(yīng)用系統(tǒng)需求說明書及應(yīng)用系統(tǒng)設(shè)計(jì)說明書中蒿辙,有關(guān)安全方面的內(nèi)容來編寫相應(yīng)的測(cè)試用例拇泛。

2.2測(cè)試方法及內(nèi)容要求

1滨巴、應(yīng)根據(jù)應(yīng)用系統(tǒng)的具體情況,設(shè)計(jì)安全性測(cè)試的具體方法和內(nèi)容俺叭,通常主要的測(cè)試方法和內(nèi)容分為功能性測(cè)試恭取、壓力測(cè)試、滲透性測(cè)試熄守、審核性測(cè)試蜈垮。

2、功能性測(cè)試要求:對(duì)應(yīng)用系統(tǒng)的安全功能點(diǎn)進(jìn)行測(cè)試柠横,確保安全功能的有效性窃款、正確性。

l這些功能點(diǎn)應(yīng)全部包含在測(cè)試大綱中牍氛,在大綱的測(cè)試用例中體現(xiàn)具體的測(cè)試方法。測(cè)試大綱中的這些內(nèi)容應(yīng)當(dāng)覆蓋了需求說明書中安全功能部分的要求烟阐。

l測(cè)試的具體內(nèi)容主要涉及以下幾個(gè)方面:

n安全審計(jì)

n通信安全

n數(shù)據(jù)保護(hù)

n身份認(rèn)證

n容錯(cuò)及資源分配方面的要求

3搬俊、壓力測(cè)試:對(duì)應(yīng)用系統(tǒng)的安全功能進(jìn)行壓力測(cè)試,確保安全功能可以滿足設(shè)計(jì)的需要蜒茄。

l壓力測(cè)試的具體應(yīng)全部包含在測(cè)試大綱中唉擂,在大綱的測(cè)試用例中體現(xiàn)具體的測(cè)試方法。

l測(cè)試大綱中的這些要求應(yīng)當(dāng)參照設(shè)計(jì)說明書中所描述的設(shè)計(jì)目標(biāo)進(jìn)

行測(cè)試用例的設(shè)計(jì)檀葛,包括但不限于:

n應(yīng)用系統(tǒng)服務(wù)器端和單個(gè)終端進(jìn)行安全數(shù)據(jù)傳輸?shù)淖畲笕萘俊?/p>

n應(yīng)用系統(tǒng)服務(wù)器端能夠與多少終端同時(shí)進(jìn)行安全數(shù)據(jù)傳輸玩祟。

n服務(wù)器承受的最大并發(fā)連接數(shù)。

4屿聋、滲透性測(cè)試:模擬攻擊手段空扎,對(duì)應(yīng)用系統(tǒng)抵抗攻擊的能力進(jìn)行測(cè)試。主要測(cè)試應(yīng)用程序及應(yīng)用系統(tǒng)配置上的安全漏洞润讥。

l滲透測(cè)試的具體應(yīng)全部包含在測(cè)試大綱中转锈,在大綱的測(cè)試用例中體現(xiàn)具體的測(cè)試方法。

l測(cè)試大綱中滲透測(cè)試方法的選擇需要依據(jù)設(shè)計(jì)說明書中描述的應(yīng)用系統(tǒng)采用的開發(fā)工具及應(yīng)用系統(tǒng)安裝所需要的基礎(chǔ)應(yīng)用平臺(tái)楚殿,如iis撮慨、apached等,來設(shè)計(jì)不同的測(cè)試方法脆粥,包括但不限于:

n對(duì)webserver的滲透攻擊測(cè)試或者工具掃描性測(cè)試砌溺。

nSQL注入、跨棧攻擊变隔。

5规伐、審核性測(cè)試:

l代碼審核。這不是必需的測(cè)試手段弟胀,如果條件允許楷力,可以針對(duì)容易出現(xiàn)代碼漏洞的程序喊式,特別是關(guān)于身份認(rèn)證等方面的部分代碼進(jìn)行審核。

l可以采用開發(fā)相關(guān)的專用掃描工具萧朝,或者編制相應(yīng)的腳本程序岔留,檢查代碼中的不安全函數(shù)的使用,如:strcpy()检柬,strcat()等献联。

6、測(cè)試過程中何址,應(yīng)詳細(xì)記錄測(cè)試過程發(fā)生的每一件事情里逆,列出測(cè)試過程中

發(fā)現(xiàn)的問題。這些信息包括:發(fā)現(xiàn)了什么用爪,在哪里發(fā)現(xiàn)的原押,當(dāng)時(shí)的環(huán)境,這些問題是否可重現(xiàn)偎血。

7诸衔、應(yīng)根據(jù)測(cè)試的過程和測(cè)試結(jié)果,提出被測(cè)試系統(tǒng)颇玷、測(cè)試過程等方面的改進(jìn)說明笨农。

8、應(yīng)確保測(cè)試用例帖渠、測(cè)試內(nèi)容和測(cè)試結(jié)果的保密性谒亦。

2.3測(cè)試環(huán)境及人員安全要求

1、測(cè)試環(huán)境的物理空郊、硬軟件環(huán)境要求應(yīng)當(dāng)可以模擬真實(shí)環(huán)境份招。

2、為確保測(cè)試環(huán)境的安全渣淳,應(yīng)將測(cè)試環(huán)境與開發(fā)環(huán)境脾还、生產(chǎn)環(huán)境相隔離,避免測(cè)試工作對(duì)業(yè)務(wù)的影響入愧。

3鄙漏、測(cè)試數(shù)據(jù)如果選擇是真實(shí)數(shù)據(jù),應(yīng)限定使用該數(shù)據(jù)的測(cè)試人員的數(shù)量棺蛛,并在測(cè)試完成后全部刪除怔蚌。

4、系統(tǒng)測(cè)試和驗(yàn)收通常需要大量的(真實(shí)數(shù)據(jù))盡可能靠近實(shí)際運(yùn)行數(shù)據(jù)的測(cè)試數(shù)據(jù)旁赊。應(yīng)避免使用含有個(gè)人信息的業(yè)務(wù)數(shù)據(jù)庫桦踊。如果要使用其中信息,在用之前應(yīng)使其失去個(gè)性化终畅。當(dāng)把運(yùn)行數(shù)據(jù)用于測(cè)試目的時(shí)籍胯,應(yīng)采取以下措施保護(hù)運(yùn)行數(shù)據(jù)竟闪。

l如果該數(shù)據(jù)由測(cè)試人員使用,則需要相關(guān)授權(quán)業(yè)務(wù)人員參與杖狼,或者監(jiān)督炼蛤。

l每次把運(yùn)行信息復(fù)制到測(cè)試應(yīng)用系統(tǒng)都應(yīng)有單獨(dú)的授權(quán)。

l應(yīng)記錄運(yùn)行信息的復(fù)制和使用蝶涩,以提供一種檢查追蹤理朋。

5、在與其他系統(tǒng)的互操作性測(cè)試中绿聘,應(yīng)充分考慮對(duì)其他系統(tǒng)的影響嗽上,選擇適當(dāng)?shù)臅r(shí)間、方法熄攘。

5.1測(cè)試后的要求

測(cè)試完成后兽愤,在正式上線前,應(yīng)進(jìn)行安全檢查鲜屏,消除測(cè)試用的一切后門烹看、用戶名及口令等,包括但不限于:

1洛史、測(cè)試用的測(cè)試數(shù)據(jù),即測(cè)試過程中的臨時(shí)數(shù)據(jù)酱吝,特別注意要?jiǎng)h除授權(quán)訪問的那些重要測(cè)試數(shù)據(jù)也殖。

2、測(cè)試用的賬號(hào)务热、口令忆嗜,特別是有高級(jí)權(quán)限的賬號(hào)。

3崎岂、測(cè)試用時(shí)臨時(shí)開通的系統(tǒng)服務(wù)捆毫、防火墻端口及策略。

與外系統(tǒng)測(cè)試時(shí)冲甘,要求外系統(tǒng)上臨時(shí)開啟的服務(wù)绩卤、賬號(hào)等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末江醇,一起剝皮案震驚了整個(gè)濱河市濒憋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陶夜,老刑警劉巖凛驮,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異条辟,居然都是意外死亡黔夭,警方通過查閱死者的電腦和手機(jī)宏胯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來本姥,“玉大人肩袍,你說我怎么就攤上這事】鄄荩” “怎么了了牛?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辰妙。 經(jīng)常有香客問我烈拒,道長,這世上最難降的妖魔是什么裙顽? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任镣丑,我火速辦了婚禮,結(jié)果婚禮上尔破,老公的妹妹穿的比我還像新娘街图。我一直安慰自己,他們只是感情好懒构,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布餐济。 她就那樣靜靜地躺著,像睡著了一般胆剧。 火紅的嫁衣襯著肌膚如雪絮姆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天秩霍,我揣著相機(jī)與錄音篙悯,去河邊找鬼。 笑死铃绒,一個(gè)胖子當(dāng)著我的面吹牛鸽照,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颠悬,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼矮燎,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了椿疗?” 一聲冷哼從身側(cè)響起漏峰,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎届榄,沒想到半個(gè)月后浅乔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年靖苇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了席噩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贤壁,死狀恐怖悼枢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脾拆,我是刑警寧澤馒索,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站名船,受9級(jí)特大地震影響绰上,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渠驼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一蜈块、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迷扇,春花似錦百揭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厨内,卻和暖如春盹舞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隘庄。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留癣亚,地道東北人丑掺。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像述雾,于是被迫代替她去往敵國和親街州。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 本文為收大量資料集整理并修改玻孟,有些涉及技術(shù)方面的已經(jīng)比較舊唆缴,歡迎大家一起完善和提建議。 1黍翎、概述 本指南是IT安全...
    站著洗澡閱讀 1,429評(píng)論 0 1
  • 一面徽、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,725評(píng)論 0 10
  • 突然的幸福 當(dāng)歷史來到拿破侖時(shí)代,法國成為歐洲最強(qiáng)大的國家,好比當(dāng)今的美國是世界上最強(qiáng)大的國家趟紊,美國文化和高科技實(shí)...
    NSR煥易閱讀 2,583評(píng)論 0 3
  • 周末出去和單位的同事游玩氮双,昨天回程的時(shí)候要排隊(duì)坐船。任同學(xué)看到排隊(duì)的人特別多霎匈,就不想排隊(duì)了戴差,我知道他不想的排隊(duì)的原...
    任同學(xué)的媽閱讀 242評(píng)論 0 1
  • 歸家的人們墨吓,總在手上拿著菜球匕,開始了廚房的戰(zhàn)斗。不一會(huì)兒肛真,微信谐丢,空間和微博都在上傳這些菜的成果展。不知從那時(shí)起蚓让,開始...
    思想聚焦的原創(chuàng)閱讀 484評(píng)論 0 7