XXWeb應(yīng)用安全開發(fā)規(guī)范_第1頁(yè)
XXWeb應(yīng)用安全開發(fā)規(guī)范_第2頁(yè)
XXWeb應(yīng)用安全開發(fā)規(guī)范_第3頁(yè)
XXWeb應(yīng)用安全開發(fā)規(guī)范_第4頁(yè)
XXWeb應(yīng)用安全開發(fā)規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

DKBA華為技術(shù)有限公司內(nèi)部技術(shù)規(guī)范DKBA1606-XXXX.XWeb應(yīng)用安全開發(fā)規(guī)范V1.52013年XX月XX日發(fā)布2013年XX月XX日實(shí)施華為技術(shù)有限公司HuaweiTechnologiesCo.,Ltd.版權(quán)所有侵權(quán)必究Allrightsreserved修訂聲明Revisiondeclaration本規(guī)范擬制與解釋部門:網(wǎng)絡(luò)安全能力中心&電信軟件與核心網(wǎng)網(wǎng)絡(luò)安全工程部本規(guī)范的相關(guān)系列規(guī)范或文件:《C&C++語(yǔ)言安全編程規(guī)范》《Java語(yǔ)言安全編程規(guī)范》相關(guān)國(guó)際規(guī)范或文件一致性:無(wú)替代或作廢的其它規(guī)范或文件:無(wú)相關(guān)規(guī)范或文件的相互關(guān)系:《產(chǎn)品網(wǎng)絡(luò)安全紅線》和《電信軟件與核心網(wǎng)業(yè)務(wù)部安全能力基線》中的Web安全要求引用了本規(guī)范的內(nèi)容,如果存在沖突,以本規(guī)范為準(zhǔn)。規(guī)范號(hào) 主要起草部門專家 主要評(píng)審部門專家 修訂情況DKBA1606-2007.4 安全解決方案:趙武42873,楊光磊57125,萬(wàn)振華55108軟件公司設(shè)計(jì)管理部:劉茂征11000,劉高峰63564,何偉祥33428 安全解決方案:劉海軍12014,吳宇翔18167,吳海翔57182接入網(wǎng):彭東紅27279無(wú)線:胡濤46634核心網(wǎng):吳桂彬41508,甘嘉棟33229,馬進(jìn)32897,謝秀洪33194,張毅27651,張永鋒40582 何偉祥33428 劉高峰63564,龔連陽(yáng)00129383,許汝波62966,吳宇翔00120395,王歡00104062,呂曉雨56987 V1.2增加了WebService、Ajax和上傳和下載相關(guān)的安全規(guī)范。 何偉祥00162822 V1.3增加了防止會(huì)話固定和防止跨站請(qǐng)求偽造的安全規(guī)范。 何偉祥00162822 V1.4增加了“規(guī)則3.4.1”的實(shí)施指導(dǎo);刪除了“建議3.4.1”;修改了“6配套CBB介紹”的內(nèi)容和獲取方式。增加了“3.9DWR” 何偉祥00162822吳淑榮00197720魏建雄00222906謝和坤00197709李田00042091孫波00175839朱雙紅00051429 王偉00207440陳偉00141500 V1.5增加“PHP”增加“3.8RESTfulWebService”修改“”刪除“”和“”附件文檔作為對(duì)象直接插入主文檔目錄TableofContents1 概述 71.1 背景簡(jiǎn)介 71.2 技術(shù)框架 71.3 使用對(duì)象 81.4 適用范圍 81.5 用詞約定 92 常見WEB安全漏洞 93 WEB設(shè)計(jì)安全規(guī)范 103.1 WEB部署要求 103.2 身份驗(yàn)證 113.2.1 口令 113.2.2 認(rèn)證 113.2.3 驗(yàn)證碼 133.3 會(huì)話管理 133.4 權(quán)限管理 153.5 敏感數(shù)據(jù)保護(hù) 163.5.1 敏感數(shù)據(jù)定義 163.5.2 敏感數(shù)據(jù)存儲(chǔ) 163.5.3 敏感數(shù)據(jù)傳輸 173.6 安全審計(jì) 183.7 WEBSERVICE 193.8 RESTFULWEBSERVICE 203.9 DWR 214 WEB編程安全規(guī)范 224.1 輸入校驗(yàn) 224.2 輸出編碼 254.3 上傳下載 264.4 異常處理 264.5 代碼注釋 264.6 歸檔要求 274.7 其他 284.8 PHP 295 WEB安全配置規(guī)范 316 配套CBB介紹 316.1 WAFCBB 316.2 驗(yàn)證碼CBB 327 附件 327.1 附件1TOMCAT配置SSL指導(dǎo) 327.2 附件2WEBSERVICE安全接入開發(fā)指導(dǎo) 327.3 附件3客戶端IP鑒權(quán)實(shí)施指導(dǎo) 327.4 附件4口令安全要求 327.5 附件5WEB權(quán)限管理設(shè)計(jì)規(guī)格說(shuō)明書 34Web應(yīng)用安全開發(fā)規(guī)范V1.51 概述1.1 背景簡(jiǎn)介在Internet大眾化及Web技術(shù)飛速演變的今天,Web安全所面臨的挑戰(zhàn)日益嚴(yán)峻。黑客攻擊技術(shù)越來(lái)越成熟和大眾化,針對(duì)Web的攻擊和破壞不斷增長(zhǎng),Web安全風(fēng)險(xiǎn)達(dá)到了前所未有的高度。許多程序員不知道如何開發(fā)安全的應(yīng)用程序,開發(fā)出來(lái)的Web應(yīng)用存在較多的安全漏洞,這些安全漏洞一旦被黑客利用將導(dǎo)致嚴(yán)重甚至是災(zāi)難性的后果。這并非危言聳聽,類似的網(wǎng)上事故舉不勝舉,公司的Web產(chǎn)品也曾多次遭黑客攻擊,甚至有黑客利用公司W(wǎng)eb產(chǎn)品的漏洞敲詐運(yùn)營(yíng)商,造成極其惡劣的影響。本規(guī)范就是提供一套完善的、系統(tǒng)化的、實(shí)用的Web安全開發(fā)方法供Web研發(fā)人員使用,以期達(dá)到提高Web安全的目的。本規(guī)范主要包括三大內(nèi)容:Web設(shè)計(jì)安全、Web編程安全、Web配置安全,配套CBB,多管齊下,實(shí)現(xiàn)Web應(yīng)用的整體安全性;本規(guī)范主要以JSP/Java編程語(yǔ)言為例。1.2 技術(shù)框架圖1典型的Web安全技術(shù)框架圖1顯示了典型的Web安全的技術(shù)框架和安全技術(shù)點(diǎn),這些安全技術(shù)點(diǎn),貫穿整個(gè)Web設(shè)計(jì)開發(fā)過(guò)程。上圖各個(gè)區(qū)域中存在任何一點(diǎn)薄弱環(huán)節(jié),都容易導(dǎo)致安全漏洞。由于HTTP的開放性,Web應(yīng)用程序必須能夠通過(guò)某種形式的身份驗(yàn)證來(lái)識(shí)別用戶,并確保身份驗(yàn)證過(guò)程是安全的,同樣必須很好地保護(hù)用于跟蹤已驗(yàn)證用戶的會(huì)話處理機(jī)制。為了防止一些惡意輸入,還要對(duì)輸入的數(shù)據(jù)和參數(shù)進(jìn)行校驗(yàn)。另外還要考慮Web系統(tǒng)的安全配置,敏感數(shù)據(jù)的保護(hù)和用戶的權(quán)限管理,以及所有操作的安全審計(jì)。當(dāng)然還要考慮代碼安全,以及其他方面的威脅。表1列出了一些Web缺陷類別,并針對(duì)每類缺陷列出了由于設(shè)計(jì)不當(dāng)可能會(huì)導(dǎo)致的潛在問(wèn)題。針對(duì)這些潛在的問(wèn)題,本規(guī)范中有相應(yīng)的解決措施。表1Web應(yīng)用程序缺陷和由于不良設(shè)計(jì)可能導(dǎo)致的問(wèn)題缺陷類別 由于不良設(shè)計(jì)可能導(dǎo)致的問(wèn)題身份驗(yàn)證 身份偽造、口令破解、權(quán)限提升和未授權(quán)訪問(wèn)。會(huì)話管理 通過(guò)捕獲導(dǎo)致會(huì)話劫持和會(huì)話偽造。權(quán)限管理 訪問(wèn)機(jī)密或受限數(shù)據(jù)、篡改和執(zhí)行未授權(quán)操作。配置管理 未授權(quán)訪問(wèn)管理界面、更新配置數(shù)據(jù)、訪問(wèn)用戶帳戶和帳戶配置文件。敏感數(shù)據(jù) 機(jī)密信息泄漏和數(shù)據(jù)篡改。加密技術(shù) 未授權(quán)訪問(wèn)機(jī)密數(shù)據(jù)或帳戶信息。安全審計(jì) 未能識(shí)別入侵征兆、無(wú)法證明用戶的操作,以及在問(wèn)題診斷中存在困難。輸入檢驗(yàn) 通過(guò)嵌入查詢字符串、窗體字段、Cookie和HTTP標(biāo)頭中的惡意字符串所執(zhí)行的攻擊。包括命令執(zhí)行、跨站點(diǎn)腳本編寫(XSS)、SQL注入和緩沖區(qū)溢出攻擊等。參數(shù)操作 路徑遍歷攻擊、命令執(zhí)行、此外還有跳過(guò)訪問(wèn)控制機(jī)制、導(dǎo)致信息泄露、權(quán)限提升和拒絕服務(wù)。異常管理 拒絕服務(wù)和敏感的系統(tǒng)級(jí)詳細(xì)信息泄露。1.3 使用對(duì)象本規(guī)范的讀者及使用對(duì)象主要為Web相關(guān)的需求分析人員、設(shè)計(jì)人員、開發(fā)人員、測(cè)試人員等。1.4 適用范圍本規(guī)范的制定考慮了公司各種Web應(yīng)用開發(fā)的共性,適合于公司絕大部分Web產(chǎn)品,要求Web產(chǎn)品開發(fā)必須遵循。對(duì)于嵌入式系統(tǒng)(如ADSLModem、硬件防火墻)中的Web應(yīng)用,由于其特殊性(CPU、內(nèi)存、磁盤容量有限,沒(méi)有成熟的Web容器),不強(qiáng)制遵循本規(guī)范的所有內(nèi)容,只需遵循以下章節(jié)的規(guī)則要求:3.2身份驗(yàn)證3.3會(huì)話管理3.5敏感數(shù)據(jù)保護(hù)4.1輸入校驗(yàn)4.2輸出編碼4.3上傳下載4.5代碼注釋4.6歸檔要求1.5 用詞約定? 規(guī)則:強(qiáng)制必須遵守的原則? 建議:需要加以考慮的原則? 說(shuō)明:對(duì)此規(guī)則或建議進(jìn)行相應(yīng)的解釋? 實(shí)施指導(dǎo):對(duì)此規(guī)則或建議的實(shí)施進(jìn)行相應(yīng)的指導(dǎo)2 常見Web安全漏洞Web應(yīng)用的安全漏洞有很多,無(wú)法窮舉。針對(duì)眾多的Web漏洞,OWASP的專家們結(jié)合各自在各領(lǐng)域的應(yīng)用安全工作經(jīng)驗(yàn)及智慧,提出了十大Web應(yīng)用程序安全漏洞,幫助人們關(guān)注最嚴(yán)重的漏洞。(OWASP即開放Web應(yīng)用安全項(xiàng)目,是一個(gè)旨在幫助人們理解和提高Web應(yīng)用及服務(wù)安全性的項(xiàng)目組織。)表2十大Web應(yīng)用程序安全漏洞列表序號(hào) 漏洞名稱 漏洞描述1 注入 注入攻擊漏洞,例如SQL、OS命令以及LDAP注入。這些攻擊發(fā)生在當(dāng)不可信的數(shù)據(jù)作為命令或者查詢語(yǔ)句的一部分,被發(fā)送給解釋器的時(shí)候。攻擊者發(fā)送的惡意數(shù)據(jù)可以欺騙解釋器,以執(zhí)行計(jì)劃外的命令或者訪問(wèn)未被授權(quán)的數(shù)據(jù)。2 跨站腳本 當(dāng)應(yīng)用程序收到含有不可信的數(shù)據(jù),在沒(méi)有進(jìn)行適當(dāng)?shù)尿?yàn)證和轉(zhuǎn)義的情況下,就將它發(fā)送給一個(gè)網(wǎng)頁(yè)瀏覽器,這就會(huì)產(chǎn)生跨站腳本攻擊(簡(jiǎn)稱XSS)。XSS允許攻擊者在受害者的瀏覽器上執(zhí)行腳本,從而劫持用戶會(huì)話、危害網(wǎng)站、或者將用戶轉(zhuǎn)向至惡意網(wǎng)站。3 失效的身份認(rèn)證和會(huì)話管理 與身份認(rèn)證和會(huì)話管理相關(guān)的應(yīng)用程序功能往往得不到正確的實(shí)現(xiàn),這就導(dǎo)致了攻擊者破壞密碼、密匙、會(huì)話令牌或攻擊其他的漏洞去冒充其他用戶的身份。4 不安全的直接對(duì)象引用 當(dāng)開發(fā)人員暴露一個(gè)對(duì)內(nèi)部實(shí)現(xiàn)對(duì)象的引用時(shí),例如,一個(gè)文件、目錄或者數(shù)據(jù)庫(kù)密匙,就會(huì)產(chǎn)生一個(gè)不安全的直接對(duì)象引用。在沒(méi)有訪問(wèn)控制檢測(cè)或其他保護(hù)時(shí),攻擊者會(huì)操控這些引用去訪問(wèn)未授權(quán)數(shù)據(jù)。5 跨站請(qǐng)求偽造 一個(gè)跨站請(qǐng)求偽造攻擊迫使登錄用戶的瀏覽器將偽造的HTTP請(qǐng)求,包括該用戶的會(huì)話cookie和其他認(rèn)證信息,發(fā)送到一個(gè)存在漏洞的Web應(yīng)用程序。這就允許了攻擊者迫使用戶瀏覽器向存在漏洞的應(yīng)用程序發(fā)送請(qǐng)求,而這些請(qǐng)求會(huì)被應(yīng)用程序認(rèn)為是用戶的合法請(qǐng)求。6 安全配置錯(cuò)誤 好的安全需要對(duì)應(yīng)用程序、框架、應(yīng)用程序服務(wù)器、Web服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器和平臺(tái),定義和執(zhí)行安全配置。由于許多設(shè)置的默認(rèn)值并不是安全的,因此,必須定義、實(shí)施和維護(hù)所有這些設(shè)置。這包括了對(duì)所有的軟件保護(hù)及時(shí)地更新,包括所有應(yīng)用程序的庫(kù)文件。7 失敗的URL訪問(wèn)權(quán)限限制 許多Web應(yīng)用程序在顯示受保護(hù)的鏈接和按鈕之前會(huì)檢測(cè)URL訪問(wèn)權(quán)限。但是,當(dāng)這些頁(yè)面被訪問(wèn)時(shí),應(yīng)用程序也需要執(zhí)行類似的訪問(wèn)控制檢測(cè),否則攻擊者將可以偽裝這些URL去訪問(wèn)隱藏的網(wǎng)頁(yè)。8 未經(jīng)驗(yàn)證的重定向和前轉(zhuǎn) Web應(yīng)用程序經(jīng)常將用戶重定向和前轉(zhuǎn)到其他網(wǎng)頁(yè)和網(wǎng)站,并且利用不可信的數(shù)據(jù)去判定目的頁(yè)面。如果沒(méi)有得到適當(dāng)驗(yàn)證,攻擊者可以將受害用戶重定向到釣魚網(wǎng)站或惡意網(wǎng)站,或者使用前轉(zhuǎn)去訪問(wèn)未經(jīng)授權(quán)的網(wǎng)頁(yè)。9 不安全的加密存儲(chǔ) 許多Web應(yīng)用程序并沒(méi)有使用恰當(dāng)?shù)募用艽胧┗騂ash算法保護(hù)敏感數(shù)據(jù),比如信用卡、社會(huì)安全號(hào)碼(SSN)、認(rèn)證憑據(jù)等。攻擊者可能利用這種弱保護(hù)數(shù)據(jù)實(shí)行身份盜竊、信用卡欺騙或或其他犯罪。10 傳輸層保護(hù)不足 應(yīng)用程序時(shí)常沒(méi)有身份認(rèn)證、加密措施,甚至沒(méi)有保護(hù)敏感網(wǎng)絡(luò)數(shù)據(jù)的保密性和完整性。而當(dāng)進(jìn)行保護(hù)時(shí),應(yīng)用程序有時(shí)采用弱算法、使用過(guò)期或無(wú)效的證書,或不正確地使用這些技術(shù)。3 Web設(shè)計(jì)安全規(guī)范3.1 Web部署要求Web應(yīng)用對(duì)Internet開放,Web服務(wù)器應(yīng)當(dāng)置于DMZ區(qū),在Web服務(wù)器與Internet之間,Web服務(wù)器與內(nèi)網(wǎng)之間應(yīng)當(dāng)有防火墻隔離,并設(shè)置合理的策略。Web應(yīng)用對(duì)Internet開放,Web服務(wù)器應(yīng)該部署在其專用的服務(wù)器上,應(yīng)避免將數(shù)據(jù)庫(kù)服務(wù)器或其他核心應(yīng)用與Web服務(wù)器部署在同一臺(tái)主機(jī)上。說(shuō)明:Web服務(wù)器比較容易被攻擊,如果數(shù)據(jù)庫(kù)或核心應(yīng)用與Web服務(wù)器部署在同一臺(tái)主機(jī),一旦Web服務(wù)器被攻陷,那么數(shù)據(jù)庫(kù)和核心應(yīng)用也就被攻擊者掌控了。說(shuō)明:Web站點(diǎn)根目錄安裝在非系統(tǒng)卷,如單獨(dú)創(chuàng)建一個(gè)目錄/home/Web作為Web站點(diǎn)根目錄,能夠防止攻擊者使用目錄遍歷攻擊訪問(wèn)系統(tǒng)工具和可執(zhí)行文件。說(shuō)明:這樣便于通過(guò)防火墻的訪問(wèn)控制策略和Web應(yīng)用來(lái)控制不同訪問(wèn)等級(jí)的訪問(wèn),比如通過(guò)防火墻策略控制,只允許內(nèi)網(wǎng)訪問(wèn)管理Portal?!翱蛻舴?wù)”和“管理”類的訪問(wèn),除了普通的認(rèn)證,還應(yīng)該增加額外的訪問(wèn)限制。說(shuō)明:額外的訪問(wèn)限制,可以限制請(qǐng)求來(lái)自企業(yè)內(nèi)網(wǎng),可以建立VPN,或采用雙向認(rèn)證的SSL;或采用更簡(jiǎn)單的辦法,通過(guò)IP地址白名單對(duì)客戶端的IP地址進(jìn)行過(guò)濾判斷,實(shí)施參考《附件3客戶端IP鑒權(quán)實(shí)施指導(dǎo)》。3.2 身份驗(yàn)證3.2.1 口令關(guān)于Web應(yīng)用及容器涉及到的口令,請(qǐng)遵循《產(chǎn)品網(wǎng)絡(luò)安全紅線》的口令安全要求(詳細(xì)內(nèi)容請(qǐng)見:附件4口令安全要求.xlsx)。3.2.2 認(rèn)證說(shuō)明:不允許僅僅通過(guò)腳本或其他形式在客戶端進(jìn)行驗(yàn)證,必須在應(yīng)用服務(wù)器進(jìn)行最終認(rèn)證處理(如果采用集中認(rèn)證,那么對(duì)用戶的最終認(rèn)證就是放在集中認(rèn)證服務(wù)器進(jìn)行)。圖2驗(yàn)證碼實(shí)施指導(dǎo):建議使用電信軟件與核心網(wǎng)網(wǎng)絡(luò)安全工程部提供的驗(yàn)證碼CBB。備注:對(duì)于嵌入式系統(tǒng),如果實(shí)現(xiàn)驗(yàn)證碼比較困難,可以通過(guò)多次認(rèn)證失敗鎖定客戶端IP的方式來(lái)防止暴力破解。說(shuō)明:如果驗(yàn)證碼和用戶名、密碼分開提交,攻擊者就可以繞過(guò)驗(yàn)證碼校驗(yàn)(如:先手工提交正確的驗(yàn)證碼,再通過(guò)程序暴力破解),驗(yàn)證碼就形同虛設(shè),攻擊者依然可以暴力破解用戶名及口令。說(shuō)明:可以存在多個(gè)登錄頁(yè)面,但是不允許存在多個(gè)可用于處理登錄認(rèn)證請(qǐng)求的模塊,防止不一致的認(rèn)證方式。說(shuō)明:具體輸入校驗(yàn)部分請(qǐng)查看4.1輸入校驗(yàn)。說(shuō)明:可以提示:“用戶名或者口令錯(cuò)誤,登錄失敗”;不能提示:“用戶名不存在”、“口令必須是6位”等等。說(shuō)明:最終用戶portal和管理portal分離,防止相互影響,防止來(lái)自用戶面的攻擊影響管理面。實(shí)施指導(dǎo):將最終用戶portal和管理portal分別部署在?煌?奈錮矸?務(wù)器;如果為了解決成本合設(shè)(部署在同一臺(tái)物理服務(wù)器上),那么,必須做到端口分離(通過(guò)不同的端口提供Web服務(wù)),一般的Web容器(如tomcat)支持為不同的Web應(yīng)用創(chuàng)建不同的端口。說(shuō)明:重要的管理事務(wù),比如重新啟動(dòng)業(yè)務(wù)模塊;重要的交易事務(wù),比如轉(zhuǎn)賬、余額轉(zhuǎn)移、充值等。重新認(rèn)證,比如讓用戶重新輸入口令。fixation)漏洞。實(shí)施指導(dǎo):場(chǎng)景一:對(duì)于從HTTP轉(zhuǎn)到HTTPS再轉(zhuǎn)到HTTP(也就是僅在認(rèn)證過(guò)程采用HTTPS,認(rèn)證成功后又轉(zhuǎn)到HTTP)的,在用戶名和密碼認(rèn)證通過(guò)后增加以下行代碼: request.getSession().invalidate(); HttpSessionnewSession=request.getSession(true); Cookiecookie=newCookie("JSESSIONID",newSession.getId()); cookie.setMaxAge(-1); cookie.setSecure(false); cookie.setPath(request.getContextPath()); response.addCookie(cookie);場(chǎng)景二:對(duì)于全程采用HTTPS協(xié)議,或者全程采用HTTP協(xié)議的,在用戶名和密碼認(rèn)證通過(guò)后增加以下行代碼: request.getSession().invalidate(); request.getSession(true);說(shuō)明:如雙因素認(rèn)證、SSL雙向證書認(rèn)證、生物認(rèn)證等;還可以通過(guò)應(yīng)用程序限制只允許某些特定的IP地址訪問(wèn)管理頁(yè)面,并且這些特定的IP地址可配置。IP地址的鎖定策略,且該鎖定策略必須設(shè)置解鎖時(shí)長(zhǎng),超時(shí)后自動(dòng)解鎖。說(shuō)明:登錄失敗應(yīng)該提示用戶:如果重試多少次不成功系統(tǒng)將會(huì)鎖定。在鎖定期間不允許該用戶帳號(hào)(或者客戶端所在機(jī)器的IP地址)登錄。允許連續(xù)失敗的次數(shù)(指從最后一次成功以來(lái)失敗次數(shù)的累計(jì)值)可配置,取值范圍為:0-99次,0表示不執(zhí)行鎖定策略,建議默認(rèn):5次。鎖定時(shí)長(zhǎng)的取值范圍為:0-999分鐘,建議默認(rèn):30分鐘,當(dāng)取值為0時(shí),表示無(wú)限期鎖定,只能通過(guò)管理員手動(dòng)解鎖(需要提供管理員對(duì)服務(wù)器鎖定其它用戶帳號(hào)/IP進(jìn)行解鎖的功能界面)。建議優(yōu)先使用帳號(hào)鎖定策略。注意:應(yīng)用程序的超級(jí)用戶帳號(hào)不能被鎖定,只能鎖定操作的客戶端所在的IP,這是為了防止系統(tǒng)不可用。特別說(shuō)明:鎖客戶端IP策略存在缺陷,當(dāng)用戶使用proxy上網(wǎng)時(shí),那么鎖定客戶端IP會(huì)導(dǎo)致使用該proxy上網(wǎng)的所有用戶在IP鎖定期間都不能使用該Web應(yīng)用;鎖定用戶帳戶的策略也存在缺陷,當(dāng)攻擊者不斷嘗試某帳戶的口令,就給該帳戶帶來(lái)拒絕服務(wù)攻擊,使該帳戶不可用。3.2.3 驗(yàn)證碼JPEG、PNG或GIF格式。說(shuō)明:驗(yàn)證碼不能使用文本格式,不允許多圖片組合(如用四個(gè)圖片拼成的驗(yàn)證碼)。說(shuō)明:在使用驗(yàn)證碼生成模塊時(shí)不允許接收來(lái)自客戶端的任何參數(shù),例如:禁止通過(guò)getcode.jsp?code=1234的URL請(qǐng)求,將1234作為驗(yàn)證碼隨機(jī)數(shù)。說(shuō)明:在客戶端網(wǎng)頁(yè)上點(diǎn)擊鼠標(biāo)右鍵、選擇“查看源文件”時(shí),必須看不到驗(yàn)證碼模塊生成的隨機(jī)數(shù)。說(shuō)明:對(duì)于java語(yǔ)言可以使用類說(shuō)明:進(jìn)行驗(yàn)證碼校驗(yàn)后,立即將會(huì)話中的驗(yàn)證碼信息清空,而不是等到生成新的驗(yàn)證碼時(shí)再去覆蓋舊的驗(yàn)證碼,防止驗(yàn)證碼多次有效;注意:當(dāng)客戶端提交的驗(yàn)證碼為空,驗(yàn)證不通過(guò)。說(shuō)明:以上規(guī)則可以通過(guò)使用電信軟件與核心網(wǎng)網(wǎng)絡(luò)安??こ灘刻峁┑?驗(yàn)證碼CBB來(lái)實(shí)現(xiàn)。3.3 會(huì)話管理說(shuō)明:目前主流的Web容器通過(guò)以下幾種方式維持會(huì)話:隱藏域、URL重寫、持久性cookie、會(huì)話cookie,但通過(guò)隱藏域、URL重寫或持久性cookie方式維持的會(huì)話容易被竊取,所以要求使用會(huì)話cookie維持會(huì)話。如果條件限制必須通過(guò)持久性cookie維持會(huì)話的話,那么cookie信息中的重要數(shù)據(jù)部分如身份信息、計(jì)費(fèi)信息等都必須進(jìn)行加密。(cookie有兩種:會(huì)話cookie和持久性cookie;會(huì)話cookie,也就是非持久性cookie,不設(shè)置過(guò)期時(shí)間,其生命期為瀏覽器會(huì)話期間,只要關(guān)閉瀏覽器窗口,cookie就消失了;會(huì)話cookie一般不存儲(chǔ)在硬盤上而是保存在內(nèi)存里。持久性cookie,設(shè)置了過(guò)期時(shí)間,被瀏覽器保存到硬盤上,關(guān)閉后再次打開瀏覽器,持久性cookie仍然有效直到超過(guò)設(shè)定的過(guò)期時(shí)間。)備注:對(duì)于嵌入式系統(tǒng)的Web,不適合本條規(guī)則,按“規(guī)則3.3.9”實(shí)施。說(shuō)明:會(huì)話過(guò)程中不允許修改的信息,例如,當(dāng)用戶通過(guò)認(rèn)證后,其用戶標(biāo)識(shí)在整個(gè)會(huì)話過(guò)程中不能被篡改。禁止通過(guò)隱藏域或URL重寫等不安全的方式存儲(chǔ)和維護(hù)。對(duì)JSP語(yǔ)言,就是應(yīng)該通過(guò)session對(duì)象進(jìn)行存儲(chǔ)和維護(hù)。說(shuō)明:非法會(huì)話的概念就是通過(guò)一系列的服務(wù)端合法性檢測(cè)(包括訪問(wèn)未授權(quán)資源,缺少必要參數(shù)等情況),最終發(fā)現(xiàn)的不是正常請(qǐng)求產(chǎn)生的會(huì)話。說(shuō)明:防止會(huì)話信息被篡改,如惡意用戶通過(guò)URL篡改手機(jī)號(hào)碼等。說(shuō)明:防止遺留在內(nèi)存中的會(huì)話信息被竊取,減少內(nèi)存占用。實(shí)施指導(dǎo):對(duì)于JSP或java語(yǔ)言使用如下語(yǔ)句:request.getSession().invalidate();說(shuō)明:建議默認(rèn)會(huì)話超時(shí)時(shí)間為10分鐘(備注:對(duì)于嵌入式系統(tǒng)中的Web,建議默認(rèn)超時(shí)時(shí)間為5分鐘,以減少系統(tǒng)資源占用)。如果沒(méi)有特殊需求,禁止使用自動(dòng)發(fā)起請(qǐng)求的機(jī)制來(lái)阻止session超時(shí)。說(shuō)明:客戶端流程控制很容易被旁路(繞過(guò)),因此流程控制必須在服務(wù)器端實(shí)現(xiàn)。實(shí)施指導(dǎo):可以通過(guò)在session對(duì)象中創(chuàng)建一個(gè)表示流程當(dāng)前狀態(tài)的標(biāo)識(shí)位,用0、1、2、3、…、N分別表示不同的處理步驟,標(biāo)識(shí)位的初始值為0,當(dāng)接收到步驟N的處理請(qǐng)求時(shí),判斷該標(biāo)識(shí)位是否為N-1,如果不為N-1,則表示步驟被繞過(guò)(或重復(fù)或亂序),拒絕受理,否則受理,受理完成后更改標(biāo)識(shí)位為N。“注銷(或退出)”的按鈕或菜單,如果該按鈕或菜單被點(diǎn)擊,則必須使對(duì)應(yīng)的會(huì)話立即失效。說(shuō)明:這樣做是為了讓用戶能夠方便地、安全地注銷或退出,減小會(huì)話劫持的風(fēng)險(xiǎn)。? 采用會(huì)話cookie維持會(huì)話。? 生成會(huì)話標(biāo)識(shí)(sessionID)要保證足夠的隨機(jī)、離散,以便不能被猜測(cè)、枚舉,要求sessionID要至少要32字節(jié),要支持字母和數(shù)字字符集。? 服務(wù)端必須對(duì)客戶端提交的sessionID的有效性進(jìn)行校驗(yàn)。說(shuō)明:在嵌入式系統(tǒng)中部署Web應(yīng)用,由于軟硬件資源所限,往往無(wú)法使用通用的Web容器及容器的會(huì)話管理功能,只能自己實(shí)現(xiàn)。另外,為了節(jié)省內(nèi)存,嵌入式webserver進(jìn)程往往是動(dòng)態(tài)啟動(dòng),為了使session更快的超時(shí),建議增加心跳機(jī)制,對(duì)客戶端瀏覽器是否關(guān)閉進(jìn)行探測(cè),5s一個(gè)心跳,30s沒(méi)有心跳則session超時(shí),關(guān)閉該session。3.4 權(quán)限管理說(shuō)明:防止用戶通過(guò)直接輸入U(xiǎn)RL,越權(quán)請(qǐng)求并執(zhí)行一些頁(yè)面或servlet;建議通過(guò)過(guò)濾器實(shí)現(xiàn)。實(shí)施指導(dǎo):請(qǐng)參考“附件5Web權(quán)限管理設(shè)計(jì)規(guī)格說(shuō)明書.docx”。說(shuō)明:禁止將授權(quán)和角色數(shù)據(jù)存放在客戶端中(比如cookie或隱藏域中),以防止被篡改。說(shuō)明:做到權(quán)限最小化和職責(zé)分離(職責(zé)分離就是分清帳號(hào)角色,系統(tǒng)管理帳號(hào)只用于系統(tǒng)管理,審計(jì)帳號(hào)只用于審計(jì),操作員帳號(hào)只用于業(yè)務(wù)維護(hù)操作,普通用戶帳號(hào)只能使用業(yè)務(wù)。)這樣即使帳號(hào)被攻擊者盜取,也能把安全損失控制在最小的限度。“root”、“administrator”、“supervisor”等特權(quán)帳號(hào)或高級(jí)別權(quán)限帳號(hào),應(yīng)該盡可能地使用低級(jí)別權(quán)限的操作系統(tǒng)帳號(hào)。說(shuō)明:根據(jù)業(yè)務(wù)系統(tǒng)要求,創(chuàng)建相應(yīng)的數(shù)據(jù)庫(kù)帳號(hào),并授予必需的數(shù)據(jù)庫(kù)權(quán)限。不能使用“sa”、“sysman”等管理帳號(hào)或高級(jí)別權(quán)限帳號(hào)。3.5 敏感數(shù)據(jù)保護(hù)3.5.1 敏感數(shù)據(jù)定義敏感數(shù)據(jù)包括但不限于:口令、密鑰、證書、會(huì)話標(biāo)識(shí)、License、隱私數(shù)據(jù)(如短消息的內(nèi)容)、授權(quán)憑據(jù)、個(gè)人數(shù)據(jù)(如姓名、住址、電話等)等,在程序文件、配置文件、日志文件、備份文件及數(shù)據(jù)庫(kù)中都有可能包含敏感數(shù)據(jù)。3.5.2 敏感數(shù)據(jù)存儲(chǔ)說(shuō)明:禁止在代碼中存儲(chǔ)如數(shù)據(jù)庫(kù)連接字符串、口令和密鑰之類的敏感數(shù)據(jù),這樣容易導(dǎo)致泄密。用于加密密鑰的密鑰可以硬編碼在代碼中。說(shuō)明:密鑰或帳號(hào)的口令必須經(jīng)過(guò)加密存儲(chǔ)。例外情況,如果Web容器的配置文件中只能以明文方式配置連接數(shù)據(jù)庫(kù)的用戶名和口令,那么就不用強(qiáng)制遵循該規(guī)則,將該配置文件的屬性改為只有屬主可讀寫。cookie中以明文形式存儲(chǔ)敏感數(shù)據(jù)。說(shuō)明:cookie信息容易被竊取,盡量不要在cookie中存儲(chǔ)敏感數(shù)據(jù);如果條件限制必須使用cookie存儲(chǔ)敏感信息時(shí),必須先對(duì)敏感信息加密再存儲(chǔ)到cookie。實(shí)施指導(dǎo):場(chǎng)景1:后臺(tái)服務(wù)端保存數(shù)據(jù)庫(kù)的登錄口令后臺(tái)服務(wù)器登錄數(shù)據(jù)庫(kù)需要使用登錄數(shù)據(jù)庫(kù)的明文口令,此時(shí)后臺(tái)服務(wù)器加密保存該口令后,下次登錄時(shí)需要還原成明文,因此,在這種情況下,不可用不可逆的加密算法,而需要使用對(duì)稱加密算法或者非對(duì)稱加密算法,一般也不建議采用非對(duì)稱加密算法。推薦的對(duì)稱加密算法:AES128、AES192、AES256。場(chǎng)景2:后臺(tái)服務(wù)端保存用戶的登錄口令在該場(chǎng)景下,一般情況是:客戶端提交用戶名及用戶口令,后臺(tái)服務(wù)端對(duì)用戶名及用戶口令進(jìn)行驗(yàn)證,然后返回驗(yàn)證的結(jié)果。此時(shí),在后臺(tái)服務(wù)端,用戶口令可以不需要還原,因此建議使用不可逆的加密算法,對(duì)“用戶名+口令”字符串進(jìn)行加密。推薦的不可逆加密算法:SHA256、SHA384、SHA512,HMAC-SHA256、HMAC-SHA384、HMAC-SHA512。說(shuō)明:禁止在日志中記錄明文的敏感數(shù)據(jù)(如口令、會(huì)話標(biāo)識(shí)jsessionid等),防止敏感信息泄漏。說(shuō)明:帶有敏感數(shù)據(jù)的Web頁(yè)面都應(yīng)該禁止緩存,以防止敏感信息泄漏或通過(guò)代理服務(wù)器上網(wǎng)的用戶數(shù)據(jù)互竄問(wèn)題。實(shí)施指導(dǎo):在HTML頁(yè)面的<HEAD>標(biāo)簽內(nèi)加入如下代碼:<HEAD><METAHTTP-EQUIV="Expires"CONTENT="0"><METAHTTP-EQUIV="Pragma"CONTENT="no-cache"><METAHTTP-EQUIV="Cache-control"CONTENT="no-cache"><METAHTTP-EQUIV="Cache"CONTENT="no-cache"></HEAD>在JSP頁(yè)面的最前面加入如下代碼:<%response.setHeader("Cache-Control","no-cache");response.setHeader("Pragma","no-cache");response.setDateHeader("Expires",0);%>其中2245562數(shù)字是隨機(jī)生成的,每次請(qǐng)求此頁(yè)面時(shí),隨機(jī)數(shù)都不同,IE始終認(rèn)為此為一個(gè)新請(qǐng)求,并重新解析,生成新的響應(yīng)頁(yè)面。3.5.3 敏感數(shù)據(jù)傳輸HTTP-POST方法提交。說(shuō)明:禁止使用HTTP-GET方法提交帶有敏感數(shù)據(jù)的表單(form),因?yàn)樵摲椒ㄊ褂貌樵冏址畟鬟f表單數(shù)據(jù),易被查看、篡改。如果是使用servlet處理提交的表單數(shù)據(jù),那么不在doGet方法中處理,只在doPost方法處理。實(shí)施指導(dǎo):1.對(duì)于JSP頁(yè)面,將表單的屬性method賦值為"post",如下<formname="form1"method="post"action="switch.jsp">2.如果是使用servlet處理提交的表單數(shù)據(jù),那么只在doPost方法中處理,參考代碼如下publicclassValidationServletextendsHttpServlet{publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{//對(duì)提交的表單數(shù)據(jù)進(jìn)行校驗(yàn)}}說(shuō)明:如果在客戶端和服務(wù)器間傳遞如帳號(hào)、口令等明文的敏感數(shù)據(jù),必須使用帶服務(wù)器端證書的SSL。由于SSL對(duì)服務(wù)端的CPU資源消耗很大,實(shí)施時(shí)必須考慮服務(wù)器的承受能力。實(shí)施指導(dǎo):1.SSL的配置請(qǐng)參考《附件1Tomcat配置SSL指導(dǎo)》。2.Web應(yīng)用中,從https切換到http過(guò)程中會(huì)丟失session,無(wú)法保持會(huì)話的連續(xù)。解決的辦法就是用http-https-http過(guò)程代替https-http過(guò)程,保證會(huì)話的連續(xù)性。原因:當(dāng)https請(qǐng)求轉(zhuǎn)為http請(qǐng)求的時(shí)候,因?yàn)樵鹊膕ession的secure屬性值是true,無(wú)法再http協(xié)議中傳輸,因此,系統(tǒng)生成新的session,且新的session沒(méi)有繼承舊session的屬性和值,因此,無(wú)法保持會(huì)話連續(xù)。而http-https-http這個(gè)過(guò)程,session始終不變,因此,可以保持會(huì)話連???說(shuō)明:由于瀏覽器會(huì)保存URL歷史記錄,如果URL中攜帶會(huì)話標(biāo)識(shí),則在多人共用的PC上會(huì)話標(biāo)識(shí)容易被其他人看到,一旦該會(huì)話標(biāo)識(shí)還在其生命有效期,則惡意用戶可以冒充受害用戶訪問(wèn)Web應(yīng)用系統(tǒng)。說(shuō)明:這些信息一旦傳送到客戶端,那么用戶也就可以獲取到了。3.6 安全審計(jì)本節(jié)的安全審計(jì)是針對(duì)Web業(yè)務(wù)應(yīng)用,不包括對(duì)操作系統(tǒng)、Web容器的安全審計(jì)。對(duì)于操作系統(tǒng)和Web容器的安全審計(jì),可以參考對(duì)應(yīng)的操作系統(tǒng)安全基線和Web安全配置規(guī)范。說(shuō)明:安全事件包括登錄、注銷、添加、刪除、修改用戶、授權(quán)、取消權(quán)限、鑒權(quán)、修改用戶口令等;操作事件包括對(duì)業(yè)務(wù)系統(tǒng)配置參數(shù)的修改,對(duì)重要業(yè)務(wù)數(shù)據(jù)的創(chuàng)建、刪除、修改、查詢等;對(duì)于上述事件的結(jié)果,不管是成功還是失敗,都需要記錄日志。說(shuō)明:只有Web應(yīng)用程序的管理員才能查詢數(shù)據(jù)庫(kù)表形式或文件形式的安全日志;除數(shù)據(jù)庫(kù)超級(jí)管理員外,只有應(yīng)用程序連接數(shù)據(jù)庫(kù)的帳號(hào)可以查詢(select)及插入(insert)安全日志表;除操作系統(tǒng)超級(jí)管理員外,只有應(yīng)用程序的運(yùn)行帳戶才能讀、寫文件形式的安全日志(但不允許刪除)。確保日志的安全,限制對(duì)日志的訪問(wèn),這加大了攻擊者篡改日志文件以掩飾其攻擊行為的難度。說(shuō)明:限制日志模塊占用的資源,以防止如自動(dòng)的惡意登陸嘗試導(dǎo)致的資源枯竭類DOS攻擊;比如限制日志記錄占用的磁盤空間。說(shuō)明:所需空間和具體業(yè)務(wù)、局點(diǎn)容量、日志保存周期相關(guān),要根據(jù)實(shí)際情況估算。說(shuō)明:備份及清理機(jī)制包括定期備份及清理安全日志和監(jiān)控用于存放安全日志的磁盤空間的使用情況。可以配置定期備份及清理的時(shí)間,可以配置以用于存放安全日志的磁盤空間使用率達(dá)到多少時(shí)進(jìn)行備份及清理。說(shuō)明:在生成安全日志時(shí),即時(shí)將日志保存到網(wǎng)絡(luò)上其他主機(jī),而且生成安全日志的應(yīng)用程序不能再訪問(wèn)存放在其他主機(jī)的日志。3.7 WebServiceService接口的調(diào)用必須進(jìn)行認(rèn)證。說(shuō)明:認(rèn)證就是確定誰(shuí)在調(diào)用WebService,并且證實(shí)調(diào)用者身份。實(shí)施指導(dǎo):可以通過(guò)在消息頭中增加用戶名和口令,作為認(rèn)證憑據(jù);對(duì)于安全性要求不高、只向同一信任域內(nèi)其他主機(jī)開放的WebService接口,可以通過(guò)簡(jiǎn)單的IP認(rèn)證來(lái)實(shí)現(xiàn)接口的認(rèn)證(只有服務(wù)器端指定IP地址的客戶端才允許調(diào)用,IP地址可配置)。Service接口的調(diào)用進(jìn)行鑒權(quán)。說(shuō)明:鑒權(quán)就是判斷調(diào)用者是否有權(quán)限調(diào)用該WebService接口。實(shí)施指導(dǎo):可以通過(guò)Axis的handler對(duì)調(diào)用進(jìn)行鑒權(quán)。Service接口傳遞敏感數(shù)據(jù)時(shí),必須保障其機(jī)密性。實(shí)施指導(dǎo):方案1:請(qǐng)參考《附件2WebService安全接入開發(fā)指導(dǎo)》。方案2:采用https安全協(xié)議。Service接口傳遞重要的交易數(shù)據(jù)時(shí),必須保障其完整性和不可抵賴性。說(shuō)明:重要的交易數(shù)據(jù),如轉(zhuǎn)賬時(shí)涉及的“轉(zhuǎn)入賬號(hào)”、“轉(zhuǎn)出賬號(hào)”、“金額”等。實(shí)施指導(dǎo):請(qǐng)參考《附件2WebService安全接入開發(fā)指導(dǎo)》。Service只對(duì)特定的IP開放,那么必須對(duì)調(diào)用WebService接口的客戶端IP進(jìn)行鑒權(quán),只有在IP地址白名單中的客戶端才允許調(diào)用,IP地址白名單可配置。實(shí)施指導(dǎo):請(qǐng)參考《附件3客戶端IP鑒權(quán)實(shí)施指導(dǎo)》。Service接口調(diào)用進(jìn)行日志記錄。說(shuō)明:日志內(nèi)容包括但不限于如下內(nèi)容:調(diào)用時(shí)間、操作類型、調(diào)用接口名稱、詳細(xì)的接口參數(shù)、客戶端IP、客戶端機(jī)器名、調(diào)用者的用戶標(biāo)識(shí)、受影響的個(gè)體(數(shù)據(jù)、資源)、成功或失敗標(biāo)識(shí)。Service提交的參數(shù)進(jìn)行輸入校驗(yàn)。說(shuō)明:具體輸入校驗(yàn)部分請(qǐng)查看4.1輸入校驗(yàn)。3.8 RESTfulWebServiceRESTfulWebService(也稱為RESTfulWebAPI)是一個(gè)使用HTTP并遵循REST原則的Web服務(wù)。WebService的調(diào)用必須進(jìn)行認(rèn)證。說(shuō)明:認(rèn)證就是確定誰(shuí)在調(diào)用RESTfulWebService,并且證實(shí)調(diào)用者身份。實(shí)施指導(dǎo):客戶端發(fā)起的Restful請(qǐng)求需要在消息頭帶Authorization字段,內(nèi)容填BasicBase64(user:pass),服務(wù)端對(duì)user和passwd進(jìn)行認(rèn)證。注意:user和pass必須加密保存在配置文件或數(shù)據(jù)庫(kù)中,不能寫死在代碼中;傳輸時(shí)采用https安全協(xié)議。對(duì)于安全性要求不高、只向同一信任域內(nèi)其他主機(jī)開放的WebService接口,可以通過(guò)簡(jiǎn)單的IP認(rèn)證來(lái)實(shí)現(xiàn)接口的認(rèn)證(只有服務(wù)器端指定IP地址的客戶端才允許調(diào)用,IP地址可配置)。WebService的調(diào)用進(jìn)行鑒權(quán)。說(shuō)明:鑒權(quán)就是判斷調(diào)用者是否有權(quán)限調(diào)用該RESTfulWebService。WebService傳遞敏感數(shù)據(jù)時(shí),必須保障其機(jī)密性。實(shí)施指導(dǎo):采用https安全協(xié)議。WebService只對(duì)特定的IP開放,那么必須對(duì)調(diào)用RESTfulWebService的客戶端IP進(jìn)行鑒權(quán),只有在IP地址白名單中的客戶端才允許調(diào)用,IP地址白名單可配置。實(shí)施指導(dǎo):請(qǐng)參考《附件3客戶端IP鑒權(quán)實(shí)施指導(dǎo)》。WebService調(diào)用進(jìn)行日志記錄。說(shuō)明:日志內(nèi)容包括但不限于如下內(nèi)容:調(diào)用時(shí)間、操作類型、調(diào)用接口名稱、詳細(xì)的接口參數(shù)、客戶端IP、客戶端機(jī)器名、調(diào)用者的用戶標(biāo)識(shí)、受影響的個(gè)體(數(shù)據(jù)、資源)、成功或失敗標(biāo)識(shí)。WebService提交的參數(shù)進(jìn)行輸入校驗(yàn)。說(shuō)明:具體輸入校驗(yàn)部分請(qǐng)查看4.1輸入校驗(yàn)。3.9 DWRDWR(DirectWebRemoting)是一種Java和JavaScript相結(jié)合的開源框架,可以幫助開發(fā)人員更容易地完成應(yīng)用Ajax技術(shù)的Web應(yīng)用程序,讓瀏覽器上的JavaScript方法調(diào)用運(yùn)行在Web服務(wù)器上的Java方法。調(diào)試功能。說(shuō)明:如果開啟了DWR調(diào)試功能,那么攻擊者可以輕易查看和調(diào)用系統(tǒng)提供的所有DWR接口,所以,版本發(fā)布時(shí),一定要關(guān)閉DWR調(diào)試功能。實(shí)施指導(dǎo):修改對(duì)應(yīng)的web.xml文件中的debug參數(shù)值為false:<servlet><servlet-name>dwr-invoker</servlet-name><init-param><param-name>debug</param-name><param-value>false</param-value></init-param>......說(shuō)明:認(rèn)證就是確定誰(shuí)在調(diào)用DWR接口,并且證實(shí)調(diào)用者身份。實(shí)施指導(dǎo):說(shuō)明:鑒權(quán)就是判斷調(diào)用者是否有權(quán)限調(diào)用該DWR接口。實(shí)施指導(dǎo):說(shuō)明:具體輸入校驗(yàn)部分請(qǐng)查看4.1輸入校驗(yàn)。4 Web編程安全規(guī)范4.1 輸入校驗(yàn)說(shuō)明:用戶產(chǎn)生的輸入是指來(lái)自text、password、textareas或file表單域的數(shù)據(jù);必須假定所有用戶產(chǎn)生的輸入都是不可信的,并對(duì)它們進(jìn)行合法性校驗(yàn)。說(shuō)明:服務(wù)器產(chǎn)生的輸入是指除用戶產(chǎn)生的輸入以外的輸入,例如來(lái)自hiddenfields、selectionboxes、checkboxes、radiobuttons、cookies、HTTPheaders、熱點(diǎn)鏈接包含的URL參數(shù)的數(shù)據(jù)或客戶端腳本等;必須假定所有服務(wù)器產(chǎn)生的輸入都是被篡改過(guò)的、惡意的,并對(duì)它們進(jìn)行合法性校驗(yàn),如果不合法,說(shuō)明有人惡意篡改數(shù)據(jù)。舉例:假如用戶資料填寫表單中的“性別”為必填項(xiàng),用radiobutton(‘男’和‘女’對(duì)應(yīng)實(shí)際值分別為‘1’和‘0’)來(lái)限制用戶的輸入,如果應(yīng)用程序收到的“性別”值為‘2’,那么可以斷定有人惡意篡改數(shù)據(jù)。說(shuō)明:HTTP標(biāo)題頭是在HTTP請(qǐng)求和HTTP響應(yīng)的開始階段發(fā)送的。Web應(yīng)用程序必須確保不以HTTP標(biāo)題頭中的任何未加密信息作為安全決策依據(jù),因?yàn)楣粽咭僮鬟@一標(biāo)題頭是很容易的。例如,標(biāo)題頭中的referer字段包含來(lái)自請(qǐng)求源端的Web頁(yè)面的URL。不要根據(jù)referer字段的值做出任何安全決策(如檢查請(qǐng)求是否來(lái)源于Web應(yīng)用程序生成的頁(yè)面),因?yàn)樵撟侄问呛苋菀妆粋卧斓?。說(shuō)明:客戶端的校驗(yàn)只能作為輔助手段,減少客戶端和服務(wù)端的信息交互次數(shù)。說(shuō)明:肯定存在攻擊行為,攻擊者繞過(guò)了客戶端的輸入校驗(yàn),因此必須使會(huì)話失效,并記入告警日志。說(shuō)明:這里的數(shù)字參數(shù)指的是完全由數(shù)字組成的數(shù)據(jù)。實(shí)施指導(dǎo):Stringmobileno=request.getParameter("mobileno");StringcharacterPattern="^\\d+$";//正則表達(dá)式表示是否全為數(shù)字if(!mobileno.matches(characterPattern)){out.println(“InvalidInput”);}說(shuō)明:對(duì)于一些有規(guī)則可循的輸入,如email地址、日期、小數(shù)等,使用正則表達(dá)式進(jìn)行白名單校驗(yàn),這樣比使用黑名單進(jìn)行校驗(yàn)更有效。實(shí)施指導(dǎo):email地址校驗(yàn)的方法:StringemailAddress=request.getParameter("emailAddress");StringcharacterPattern="^([a-z0-9A-Z]+[_-]?)+[a-z0-9A-Z]@(([a-z0-9A-Z]+[_-]?)+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,4}$";//email正則表達(dá)式if(!emailAddress.matches(characterPattern)){out.println(“InvalidEmailAddress”);}說(shuō)明:可定義一個(gè)合法字符集。實(shí)施指導(dǎo):Stringtext=request.getParameter("text");StringcharacterPattern="^[A-Za-z]*$";//開發(fā)者自行定義字符規(guī)則(方括號(hào)內(nèi)的字符集)if(!text.matches(characterPattern)){out.println(“InvalidInput”);}說(shuō)明:如果輸入數(shù)據(jù)是字符串,必須校驗(yàn)字符串的長(zhǎng)度是否符合要求,長(zhǎng)度校驗(yàn)會(huì)加大攻擊者實(shí)施攻擊的難度。說(shuō)明:如果輸入數(shù)據(jù)是數(shù)值,必須校驗(yàn)數(shù)值的范圍是否正確,如年齡應(yīng)該為0~150之間的正整數(shù)。SQL語(yǔ)句。說(shuō)明:禁止通過(guò)字符串串聯(lián)直接使用用戶輸入構(gòu)造可執(zhí)行SQL語(yǔ)句,如:stringsql="selectstatusfromUserswhereUserName='"+txtUserName.Text+"'";這樣很容易被SQL注入攻擊。說(shuō)明:使用預(yù)編譯語(yǔ)句PreparedStatement,類型化SQL參數(shù)將檢查輸入的類型,確保輸入值在數(shù)據(jù)庫(kù)中當(dāng)作字符串、數(shù)字、日期或boolean等值而不是可執(zhí)行代碼進(jìn)行處理,從而防止SQL注入攻擊。而且,由于PreparedStatement對(duì)象已預(yù)編譯過(guò),所以其執(zhí)行速度要快于Statement對(duì)象。因此,多次執(zhí)行的SQL語(yǔ)句經(jīng)常創(chuàng)建為PreparedStatement對(duì)象,還可以提高效率。實(shí)施指導(dǎo):參考如下代碼:Stringinssql="insertintobuy(empid,name,age,birthday)values(?,?,?,?)";PreparedStatementstmt=null;stmt=conn.prepareStatement(inssql);stmt.setString(1,empid);stmt.setString(2,name);stmt.setInt(3,age);stmt.setDate(4,birthday);stmt.execute();備注:使用like進(jìn)行模糊查詢時(shí),如果直接用"select*fromtablewherecommentlike%?%",程序會(huì)報(bào)錯(cuò),必須采用如下方法Stringexpress="select*fromtablewherecommentlike?";pstmt=con.prepareStatement(express);Stringc="hello";pstmt.setString(1,"%"+c+"%");//參數(shù)自動(dòng)添加單引號(hào),最后的SQL語(yǔ)句為:select*fromtablewherecommentlike'%hello%'pstmt.execute();說(shuō)明:和動(dòng)態(tài)構(gòu)建SQL一樣,動(dòng)態(tài)構(gòu)建XPath語(yǔ)句也會(huì)導(dǎo)致注入漏洞(XPath注入)。動(dòng)態(tài)構(gòu)建XPath語(yǔ)句的例子:publicbooleandoLogin(StringloginID,Stringpassword){...... XPathExpressionexpr=pile("http://users/user[loginID/text()='"+loginID+"'andpassword/text()='"+password+"']/firstname/text()"); ......}說(shuō)明:property="*"這表明用戶在可見的JSP頁(yè)面中輸入的,或是直接通過(guò)Query/addToBasket.jsp?newItem=ITEM0105342&balance=0,這樣,balance=0的信息就被在存儲(chǔ)到了JavaBean中了,而balance是整個(gè)會(huì)話中用來(lái)存儲(chǔ)總費(fèi)用的,當(dāng)他們這時(shí)點(diǎn)擊“chekout”結(jié)賬的時(shí)候,費(fèi)用就全免了。說(shuō)明:注意,“回車”字符有多種表示方式(CR=%0d=\r),“換行”字符有多種表示方式(LF=%0a=\n)。說(shuō)明:如果服務(wù)端代碼中使用Runtime.getRuntime().exec(cmd)或ProcessBuilder等執(zhí)行操作系統(tǒng)命令,那么禁止從客戶端獲取命令;而且最好不要從客戶端獲取命令的參數(shù),如果必須從客戶獲取命令的參數(shù),那么必須采用正則表達(dá)式對(duì)命令參數(shù)進(jìn)行嚴(yán)格的校驗(yàn),以防止命令注入(因?yàn)椋坏目蛻舳双@取命令或參數(shù),通過(guò);&|<>符號(hào),非常容易構(gòu)造命令注入,危害系統(tǒng))。4.2 輸出編碼說(shuō)明:不可信的數(shù)據(jù)(也就是其他業(yè)務(wù)系統(tǒng)生成的未經(jīng)本應(yīng)用程序驗(yàn)證的表數(shù)據(jù)或文件數(shù)據(jù)),通過(guò)對(duì)輸出到客戶端的數(shù)據(jù)進(jìn)行編碼,可以防止瀏覽器將HTML視為可執(zhí)行腳本,從而防止跨站腳本攻擊。實(shí)施指導(dǎo):JSP語(yǔ)言可以通過(guò)替換輸出數(shù)據(jù)的特殊字符【&<>”’()%+-】為其他表示形式后再輸出給客戶端,例如:<%StringOutStr="<script>alert('XSS')</script>";OutStr=OutStr.replaceAll("&","&");OutStr=OutStr.replaceAll("<","<");OutStr=OutStr.replaceAll(">",">");OutStr=OutStr.replaceAll("\"",""");OutStr=OutStr.replaceAll("\'","'");OutStr=OutStr.replaceAll("\\(","(");OutStr=OutStr.replaceAll("\\)",")");out.println(OutStr);%>ASP.NET語(yǔ)言可以通過(guò)HtmlEncode方法對(duì)HTML的輸出進(jìn)行編碼。PHP語(yǔ)言可以通過(guò)htmlentities或htmlspecialchars方法對(duì)HTML輸出進(jìn)行編碼。4.3 上傳下載說(shuō)明:建議對(duì)寫/上傳文件的路徑或文件名采用隨機(jī)方式生成,或?qū)?上傳文件放置在有適當(dāng)訪問(wèn)許可的專門目錄。對(duì)讀/下載文件采用映射表(例如,用戶提交的讀文件參數(shù)為1,則讀取file1,參數(shù)為2,則讀取file2)。防止惡意用戶構(gòu)造路徑和文件名,實(shí)施目錄跨越和不安全直接對(duì)象引用攻擊。說(shuō)明:Web內(nèi)容目錄指的是:通過(guò)Web可以直接瀏覽、訪問(wèn)的目錄,存放在Web內(nèi)容目錄下的文件容易被攻擊者直接下載。4.4 異常處理說(shuō)明:應(yīng)用程序出現(xiàn)異常時(shí),禁止將數(shù)據(jù)庫(kù)版本、數(shù)據(jù)庫(kù)結(jié)構(gòu)、操作系統(tǒng)版本、堆棧跟蹤、文件名和路徑信息、SQL查詢字符串等對(duì)攻擊者有用的信息返回給客戶端。建議重定向到一個(gè)統(tǒng)一、默認(rèn)的錯(cuò)誤提示頁(yè)面,進(jìn)行信息過(guò)濾。說(shuō)明:記錄詳細(xì)的錯(cuò)誤消息,可供入侵檢測(cè)及問(wèn)題定位。4.5 代碼注釋說(shuō)明:動(dòng)態(tài)頁(yè)面包括ASP、PHP、JSP、CGI等由動(dòng)態(tài)語(yǔ)言生成的頁(yè)面。通過(guò)瀏覽器查看源碼的功能,能夠查看動(dòng)態(tài)頁(yè)面中的普通注釋信息,但看不到隱藏注釋(隱藏注釋不會(huì)發(fā)送給客戶端)。因此,為了減少信息泄漏,建議只使用隱藏注釋。實(shí)施指導(dǎo):<formaction=h.jsp><%--隱藏注釋1--%><textareaname=alength=200></textarea><inputtype=submitvalue=test></form><%//隱藏注釋2str=(String)request.getParameter("a");/*隱藏注釋3*/str=str.replaceAll("<","<");out.println(str);%>4.6 歸檔要求說(shuō)明:惡意用戶可以通過(guò)URL請(qǐng)求諸如.bak之類的文件,Web服務(wù)器會(huì)將這些文件以文本方式呈現(xiàn)給惡意用戶,造成代碼的泄漏,嚴(yán)重威脅Web應(yīng)用的安全。實(shí)施指導(dǎo):在web應(yīng)用的根目錄下執(zhí)行以下命令:find./-name"*.old"-o-name"*.OLD"-o-name"*.bak"-o-name"*.BAK"-o-name"*.temp"-o-name"*.tmp"-o-name"*.save"-o-name"*.backup"-o-name"*.orig"-o-name"*.000"-o-name"*~"-o-name"*~1"-o-name"*.dwt"-o-name"*.tpl"-o-name"*.zip"-o-name"*.7z"-o-name"*.rar"-o-name"*.gz"-o-name"*.tgz"-o-name"*.tar"-o-name"*.bz2"分析查找到的文件是否臨時(shí)文件、備份文件、無(wú)用文件,如果是則刪除。說(shuō)明:很多Webserver對(duì)大小寫是敏感的,但對(duì)后綴的大小寫映像并沒(méi)有做正確的處理。攻擊者只要在URL中將JSP文件后綴從小寫變成大寫,Web服務(wù)器就不能正確處理這個(gè)文件后綴,而將其當(dāng)作純文本顯示。攻擊者可以通過(guò)查看源碼獲得這些程序的源代碼。因此,歸檔的頁(yè)面程序文件的擴(kuò)展名必須使用小寫字母,如jsp、html、htm、asp等頁(yè)面程序文件的擴(kuò)展名分別為jsp、html、htm、asp。說(shuō)明:這里的“調(diào)試用的代碼”是指開發(fā)過(guò)程中進(jìn)行臨時(shí)調(diào)試所用的、在Web應(yīng)用運(yùn)行過(guò)程中不需要使用到的Web頁(yè)面代碼或servlet代碼。例如:在代碼開發(fā)過(guò)程中為了測(cè)試一個(gè)添加帳號(hào)的功能,開發(fā)人員臨時(shí)編寫了一個(gè)JSP頁(yè)面進(jìn)行測(cè)試,那么在歸檔時(shí),該JSP頁(yè)面必須刪除,以免被攻擊者利用。4.7 其他說(shuō)明:在web.xml文件中為servlet配置URI映射,使用servlet時(shí),引用它的URI映射,而不允許通過(guò)絕對(duì)路徑訪問(wèn)。說(shuō)明:跨站請(qǐng)求偽造(CSRF)是一種挾制終端用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。攻擊者可以迫使用戶去執(zhí)行攻擊者預(yù)先設(shè)置的操作,例如,如果用戶登錄網(wǎng)絡(luò)銀行去查看其存款余額,他沒(méi)有退出網(wǎng)絡(luò)銀行系統(tǒng)就去了自己喜歡的論壇去灌水,如果攻擊者在論壇中精心構(gòu)造了一個(gè)惡意的鏈接并誘使該用戶點(diǎn)擊了該鏈接,那么該用戶在網(wǎng)絡(luò)銀行帳戶中的資金就有可能被轉(zhuǎn)移到攻擊者指定的帳戶中。當(dāng)CSRF針對(duì)普通用戶發(fā)動(dòng)攻擊時(shí),將對(duì)終端用戶的數(shù)據(jù)和操作指令構(gòu)成嚴(yán)重的威脅;當(dāng)受攻擊的終端用戶具有管理員帳戶的時(shí)候,CSRF攻擊將危及整個(gè)Web應(yīng)用程序。實(shí)施指導(dǎo):方法一:為每個(gè)session創(chuàng)建唯一的隨機(jī)字符串,并在受理請(qǐng)求時(shí)驗(yàn)證<formaction="/transfer.do"method="post"><inputtype="hidden"name="randomStr"value=<%=request.getSession().getAttribute("randomStr")%>>......</form>//判斷客戶端提交的隨機(jī)字符串是否正確StringrandomStr=(String)request.getParameter("randomStr");if(randomStr==null)randomStr="";if(randomStr.equals(request.getSession().getAttribute("randomStr"))){//處理請(qǐng)求}else{//跨站請(qǐng)求攻擊,注銷會(huì)話}方法二:受理重要操作請(qǐng)求時(shí),在相應(yīng)的表單頁(yè)面增加圖片驗(yàn)證碼,用戶提交操作請(qǐng)求的同時(shí)提交驗(yàn)證碼,在服務(wù)器端先判斷用戶提交的驗(yàn)證碼是否正確,驗(yàn)證碼正確再受理操作請(qǐng)求。方法三:向電信軟件與核心網(wǎng)網(wǎng)絡(luò)安全工程部申請(qǐng)WAFCBB,并部署到應(yīng)用中,啟用AntiCSRF功能,具體方法參考WAFCBB的用戶手冊(cè)。說(shuō)明:使用.innerHtml會(huì)將內(nèi)容以HTML顯示,容易被利用,導(dǎo)致跨站腳本。實(shí)施指導(dǎo):<ahref="javascript:alert(document.getElementById('test').innerHTML.replace(/<.+?>/gim,''))">無(wú)HTML,符合W3C標(biāo)準(zhǔn)</a>備注:還可以使用.innerText代替.innerHtml,.innerText只顯示文本內(nèi)容不顯示HTML標(biāo)簽,但.innerText不是W3C標(biāo)準(zhǔn)的屬性,不能適用于所有瀏覽器(但適用于IE瀏覽器)。說(shuō)明:eval()函數(shù)存在安全隱患,該函數(shù)可以把輸入的字符串當(dāng)作JavaScript表達(dá)式執(zhí)行,容易被惡意用戶利用。說(shuō)明:瀏覽器都具有自動(dòng)保存用戶輸入數(shù)據(jù)和自動(dòng)填充數(shù)據(jù)的能

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論