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)等。