![應(yīng)用系統(tǒng)安全開發(fā)技術(shù)規(guī)范培訓(xùn)資料_第1頁(yè)](http://file4.renrendoc.com/view2/M00/03/3C/wKhkFmaoQlKAL-E3AABikxOxI-Q063.jpg)
![應(yīng)用系統(tǒng)安全開發(fā)技術(shù)規(guī)范培訓(xùn)資料_第2頁(yè)](http://file4.renrendoc.com/view2/M00/03/3C/wKhkFmaoQlKAL-E3AABikxOxI-Q0632.jpg)
![應(yīng)用系統(tǒng)安全開發(fā)技術(shù)規(guī)范培訓(xùn)資料_第3頁(yè)](http://file4.renrendoc.com/view2/M00/03/3C/wKhkFmaoQlKAL-E3AABikxOxI-Q0633.jpg)
![應(yīng)用系統(tǒng)安全開發(fā)技術(shù)規(guī)范培訓(xùn)資料_第4頁(yè)](http://file4.renrendoc.com/view2/M00/03/3C/wKhkFmaoQlKAL-E3AABikxOxI-Q0634.jpg)
![應(yīng)用系統(tǒng)安全開發(fā)技術(shù)規(guī)范培訓(xùn)資料_第5頁(yè)](http://file4.renrendoc.com/view2/M00/03/3C/wKhkFmaoQlKAL-E3AABikxOxI-Q0635.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
應(yīng)用系統(tǒng)安全開發(fā)技術(shù)規(guī)范(版本號(hào)V1.3)朗新科技股份有限公司二〇一五年十二月更改履歷版本號(hào)修改編號(hào)更改時(shí)間更改的圖表和章節(jié)號(hào)更改簡(jiǎn)要描述更改人批準(zhǔn)人0.52013-11-24初稿施偉施偉1.02015-11-19修改宋月欣陳志明1.12015-11-30修改宋月欣陳志明1.22015-12-3修改宋月欣施偉1.32015-12-3修改施偉注:更改人除形成初稿,以后每次修改在未批準(zhǔn)確認(rèn)前均需采用修訂的方式進(jìn)行修改。目錄1 背景與目標(biāo) 12 安全編程概念 12.1 安全編程 12.2 結(jié)構(gòu)化編程 22.3 脆弱性 22.4 可信計(jì)算 22.5 安全可信模塊 32.6 不可信任模塊 32.7 敏感信息 32.8 特權(quán) 32.9 信息隱藏 32.10 中間件 32.11 死鎖 42.12 可信邊界 42.13 元字符 42.14 參數(shù)化查詢 42.15 UNIXJAIL環(huán)境 42.16 臨時(shí)文件 42.17 信息熵 52.18 SSL 52.19 TLS 52.20 HTTPS 52.21 Http會(huì)話 52.22 Cookie 62.23 HttpOnlyCookie 63 安全編程原則 63.1 統(tǒng)一的安全規(guī)范 63.2 模塊劃分 63.3 最小化功能 73.4 最小化特權(quán) 73.5 對(duì)多任務(wù)、多進(jìn)程加以關(guān)注 73.6 界面輸出最小化 73.7 使代碼簡(jiǎn)單、最小化和易于修改 83.8 避免高危的服務(wù)、協(xié)議 83.9 數(shù)據(jù)和代碼分離 83.10 關(guān)鍵數(shù)據(jù)傳輸保護(hù) 83.11 禁止賦予用戶進(jìn)程特權(quán) 83.12 使用適當(dāng)?shù)臄?shù)據(jù)類型 93.13 使用經(jīng)過(guò)驗(yàn)證的安全代碼 93.14 使用應(yīng)用中間件 93.15 設(shè)計(jì)錯(cuò)誤、異常處理機(jī)制 93.16 提供備份機(jī)制 93.17 檢查傳遞變量的合法性 93.18 檢查所有函數(shù)返回代碼 93.19 修改面向用戶的操作的反饋缺省描述 93.20 文件操作的要求 103.21 其他編碼原則 104 應(yīng)用安全分析 114.1 安全需求 114.2 安全威脅 114.2.1 Web安全漏洞 114.2.2 拒絕服務(wù)攻擊 124.2.3 嗅探攻擊 124.2.4 中間人攻擊 124.3 安全約束 135 安全編程要求 135.1 輸入處理 135.1.1 建立可信邊界 135.1.2 驗(yàn)證各種來(lái)源的輸入 145.1.3 保證所有的輸入信息是被驗(yàn)證過(guò)的 145.1.4 對(duì)輸入內(nèi)容進(jìn)行規(guī)范化處理后再進(jìn)行驗(yàn)證 155.1.5 選擇合適的數(shù)據(jù)驗(yàn)證方式 155.1.6 防范元字符攻擊 155.1.7 拒絕驗(yàn)證失敗的數(shù)據(jù) 155.1.8 在服務(wù)端進(jìn)行驗(yàn)證 155.1.9 建立統(tǒng)一的輸入驗(yàn)證接口 165.1.10 控制寫入日志的信息 165.1.11 從服務(wù)器端提取關(guān)鍵參數(shù) 165.2 輸出處理 165.2.1 限制返回給客戶的信息 165.2.2 建立錯(cuò)誤信息保護(hù)機(jī)制 165.3 數(shù)據(jù)庫(kù)訪問 165.3.1 合理分配數(shù)據(jù)庫(kù)訪問權(quán)限 165.3.2 合理存放數(shù)據(jù)庫(kù)連接帳號(hào)和密碼信息 175.3.3 使用參數(shù)化請(qǐng)求方式 175.3.4 對(duì)SQL語(yǔ)句中來(lái)自于不可信區(qū)域的輸入?yún)?shù)進(jìn)行驗(yàn)證 185.3.5 對(duì)數(shù)據(jù)庫(kù)操作的返回?cái)?shù)據(jù)進(jìn)行驗(yàn)證 185.3.6 分次提取數(shù)據(jù) 185.3.7 通過(guò)row(行)級(jí)別的訪問控制來(lái)使用數(shù)據(jù)庫(kù) 185.3.8 確保數(shù)據(jù)庫(kù)資源被釋放 185.4 文件操作 195.4.1 對(duì)上傳文件進(jìn)行限制 195.4.2 把文件名以及文件內(nèi)容作為不可信的輸入對(duì)待 195.4.3 安全的使用文件名 195.4.4 使用文件系統(tǒng)訪問控制 195.4.5 注意文件訪問競(jìng)爭(zhēng)條件 195.4.6 安全使用臨時(shí)文件 205.4.7 確保文件系統(tǒng)資源被釋放 206 安全特征 206.1 關(guān)注應(yīng)用的對(duì)象重用 206.2 用戶訪問控制信息的機(jī)密性 206.3 不要在客戶端存放敏感數(shù)據(jù) 206.4 避免內(nèi)存溢出 216.5 可配置數(shù)據(jù)保護(hù) 216.6 禁止在源代碼中寫入口令 216.7 隨機(jī)數(shù) 216.8 使用可信的密碼算法 226.9 異常管理 227 應(yīng)用安全設(shè)計(jì)規(guī)范 237.1 應(yīng)用安全規(guī)劃 237.2 數(shù)據(jù)安全等級(jí)劃分 237.3 數(shù)據(jù)庫(kù)規(guī)劃 237.3.1 用戶權(quán)限 237.3.2 數(shù)據(jù)源設(shè)計(jì) 237.3.3 外部系統(tǒng)訪問 237.4 角色劃分 247.5 URL規(guī)劃 247.6 程序文件目錄規(guī)劃 247.6.1 數(shù)據(jù)及程序分離 247.6.2 靜態(tài)程序資源 247.6.3 程序文件分類 247.7 Cookie 247.8 文件安全 257.8.1 文件存儲(chǔ) 257.8.2 文件操作 257.8.3 文件類型 257.9 第三方組件安全 257.9.1 組件兼容性 257.9.2 組件安全及成熟度 257.9.3 組件配置 257.10 WebService 257.11 RESTfulWebService 267.12 應(yīng)用安全關(guān)注點(diǎn) 277.13 應(yīng)用安全限制應(yīng)對(duì)方案 297.13.1 外網(wǎng)隔離 297.13.2 外網(wǎng)文件操作 297.13.3 正向和反向隔離裝置(國(guó)網(wǎng)系統(tǒng)) 298 應(yīng)用安全開發(fā)規(guī)范 308.1 Java及Web安全編程規(guī)范 308.1.1 不信任未知 308.1.2 數(shù)據(jù)層開發(fā) 308.1.3 會(huì)話管理 328.1.4 Cookie 338.1.5 輸入驗(yàn)證 338.1.6 輸入文件名的驗(yàn)證 348.1.7 輸出處理 348.1.8 敏感信息處理 368.1.9 異常信息處理 378.1.10 特殊頁(yè)面跳轉(zhuǎn) 378.1.11 文件操作 378.1.12 資源釋放 388.1.13 內(nèi)存控制 388.1.14 外部程序調(diào)用漏洞 388.1.15 整數(shù)溢出 398.2 C++安全編程規(guī)范 398.2.1 不信任未知 398.2.2 免緩存區(qū)溢出 408.2.3 免緩整數(shù)溢出 428.2.4 域名合法性檢查 458.2.5 檢查返回值 468.2.6 產(chǎn)生隨機(jī)數(shù) 478.2.7 驗(yàn)證輸入文件名 488.2.8 類設(shè)計(jì)注意事項(xiàng) 488.2.9 外部程序調(diào)用漏洞 508.2.10 臨時(shí)文件處理 50背景與目標(biāo)在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ī)范為解決Web應(yīng)用系統(tǒng)安全問題,對(duì)主要的應(yīng)用安全問題進(jìn)行分析,并有針對(duì)性的從設(shè)計(jì)及開發(fā)規(guī)范、開發(fā)管理、安全組件框架、安全測(cè)試方面提供整體的安全解決方案。使本組織能以標(biāo)準(zhǔn)的、規(guī)范的方式設(shè)計(jì)和編碼。通過(guò)建立編碼規(guī)范,以使每個(gè)開發(fā)人員養(yǎng)成良好的編碼風(fēng)格和習(xí)慣;并以此形成開發(fā)小組編碼約定,提高程序的可靠性、可讀性、可修改性、可維護(hù)性和一致性等,增進(jìn)團(tuán)隊(duì)間的交流,并保證軟件產(chǎn)品的質(zhì)量。安全編程概念安全編程安全編程是指開發(fā)人員首先需要具備一定的安全知識(shí),然后識(shí)別數(shù)據(jù)在流轉(zhuǎn)(輸入、處理和輸出)過(guò)程中可能面對(duì)的威脅,對(duì)這些威脅進(jìn)行分析得出其利用的漏洞,通過(guò)合理地編寫代碼消除這些漏洞,降低軟件面臨的風(fēng)險(xiǎn)。本規(guī)范對(duì)開發(fā)人員的編碼提出統(tǒng)一的安全要求,主要涉及輸入處理、輸出處理、數(shù)據(jù)庫(kù)訪問、文件操作、異常管理等方面,如下圖:輸入處理部分能指導(dǎo)開發(fā)者避免用戶的不良輸入;輸出處理能指導(dǎo)開發(fā)者對(duì)輸出內(nèi)容進(jìn)行過(guò)濾;數(shù)據(jù)庫(kù)訪問、文件操作部分則能指導(dǎo)開發(fā)者進(jìn)行數(shù)據(jù)庫(kù)查詢,寫入文件等操作時(shí)進(jìn)行防護(hù);而異常管理、敏感數(shù)據(jù)保護(hù)、對(duì)象重用等技術(shù)則指導(dǎo)開發(fā)者改進(jìn)軟件的自身缺陷。WEB開發(fā)規(guī)范部分則指導(dǎo)用戶在WEB系統(tǒng)(B/S架構(gòu)應(yīng)用)的研發(fā)方面時(shí)如何增加對(duì)應(yīng)用軟件的保護(hù)。結(jié)構(gòu)化編程結(jié)構(gòu)化編程,一種編程典范。它采用子程序、程式碼區(qū)塊、for循環(huán)以及while循環(huán)等結(jié)構(gòu),來(lái)取代傳統(tǒng)的goto。希望借此來(lái)改善計(jì)算機(jī)程序的明晰性、品質(zhì)以及開發(fā)時(shí)間,并且避免寫出面條式代碼。脆弱性脆弱性指計(jì)算機(jī)系統(tǒng)安全方面的缺陷,使得系統(tǒng)或其應(yīng)用數(shù)據(jù)的保密性、完整性、可用性、訪問控制、監(jiān)測(cè)機(jī)制等面臨威脅??尚庞?jì)算可信計(jì)算的行為會(huì)更全面地遵循設(shè)計(jì),而執(zhí)行設(shè)計(jì)者和軟件編寫者所禁止的行為的概率很低。安全可信模塊審計(jì)和訪問控制模塊是唯一的安全可信模塊。不可信任模塊除審計(jì)和訪問控制模塊外其它所有模塊均為不可信模塊。敏感信息系統(tǒng)的敏感信息包括用戶身份信息、認(rèn)證信息、授權(quán)信息、交易過(guò)程中的私密或隱私信息、其它的敏感信息。特權(quán)特權(quán)只是允許去做并不是每個(gè)人都可以做的事情。信息隱藏信息隱藏指在設(shè)計(jì)和確定模塊時(shí),使得一個(gè)模塊內(nèi)包含的特定信息(過(guò)程或數(shù)據(jù)),對(duì)于不需要這些信息的其他模塊來(lái)說(shuō),是不可訪問的。信息隱藏基本原理框圖:中間件中間件是提供系統(tǒng)軟件和應(yīng)用軟件之間連接的軟件,以便于軟件各部件之間的溝通.中間件技術(shù)創(chuàng)建在對(duì)應(yīng)用軟件部分常用功能的抽象上,將常用且重要的過(guò)程調(diào)用、分布式組件、消息隊(duì)列、事務(wù)、安全、連結(jié)器、商業(yè)流程、網(wǎng)絡(luò)并發(fā)、HTTP服務(wù)器、WebService等功能集于一身或者分別在不同品牌的不同產(chǎn)品中分別完成。死鎖死鎖是操作系統(tǒng)或軟件運(yùn)行的一種狀態(tài):在多任務(wù)系統(tǒng)下,當(dāng)一個(gè)或多個(gè)進(jìn)程等待系統(tǒng)資源,而資源又被進(jìn)程本身或其它進(jìn)程占用時(shí),就形成了死鎖??尚胚吔缈尚胚吔缈梢员徽J(rèn)為是在程序中劃定的一條分隔線,一邊的數(shù)據(jù)是不可信的而另一邊則是可信的。當(dāng)數(shù)據(jù)要從不可信的一側(cè)到可信一側(cè)的時(shí)候,需要使用驗(yàn)證邏輯進(jìn)行判斷。元字符元字符就是在編程語(yǔ)言中具有特定含義的字符或者字符串。例如在SQL查詢中,單引號(hào)(‘)是危險(xiǎn)的字符;在文件系統(tǒng)路徑中兩個(gè)點(diǎn)號(hào)(..)是危險(xiǎn)的字符;在命令shell中,分號(hào)(;)和雙&(&&)符號(hào)同樣是危險(xiǎn)的字符,而換行符(\n)對(duì)日志文件很關(guān)鍵。參數(shù)化查詢參數(shù)化查詢(ParameterizedQuery或ParameterizedStatement)是指在設(shè)計(jì)與數(shù)據(jù)庫(kù)鏈接并訪問數(shù)據(jù)時(shí),在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù)(Parameter)來(lái)給值,這個(gè)方法目前已被視為最有效可預(yù)防SQL注入攻擊(SQLInjection)的攻擊手法的防御方式。UNIXJAIL環(huán)境一個(gè)被改變根目錄的程序不可以訪問和命名在被改變根目錄外的文件,那個(gè)根目錄叫做“chroot監(jiān)獄(chrootjail,chrootprison)”。臨時(shí)文件創(chuàng)建臨時(shí)文件的程序會(huì)在完成時(shí)將其刪除。信息熵信息熵指信息的不確定性,一則高信息度的信息熵是很低的,低信息度的熵則高。SSL安全套接層(SecureSocketsLayer,SSL),一種安全協(xié)議,是網(wǎng)景公司(Netscape)在推出Web瀏覽器首版的同時(shí)提出的,目的是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性。SSL在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。SSL采用公開密鑰技術(shù),保證兩個(gè)應(yīng)用間通信的保密性和可靠性,使客戶與服務(wù)器應(yīng)用之間的通信不被攻擊者竊聽。它在服務(wù)器和客戶機(jī)兩端可同時(shí)被支持,目前已成為互聯(lián)網(wǎng)上保密通訊的工業(yè)標(biāo)準(zhǔn)。現(xiàn)行Web瀏覽器亦普遍將HTTP和SSL相結(jié)合,從而實(shí)現(xiàn)安全通信。此協(xié)議和其繼任者是TLS。TLSSSL(SecureSocketsLayer)是網(wǎng)景公司(Netscape)設(shè)計(jì)的主要用于Web的安全傳輸協(xié)議。這種協(xié)議在Web上獲得了廣泛的應(yīng)用。IETF()將SSL作了標(biāo)準(zhǔn)化,即RFC2246,并將其稱為TLS(TransportLayerSecurity),其最新版本是RFC5246,版本1.2。從技術(shù)上講,TLS1.0與SSL3.0的差異非常微小。HTTPS超文本傳輸安全協(xié)議(縮寫:HTTPS,英語(yǔ):HypertextTransferProtocolSecure)是超文本傳輸協(xié)議和SSL/TLS的組合,用以提供加密通訊及對(duì)網(wǎng)絡(luò)服務(wù)器身份的鑒定。HTTPS連接經(jīng)常被用于萬(wàn)維網(wǎng)上的交易支付和企業(yè)信息系統(tǒng)中敏感信息的傳輸。HTTPS不應(yīng)與在RFC2660中定義的安全超文本傳輸協(xié)議(S-HTTP)相混。Http會(huì)話在計(jì)算機(jī)科學(xué)領(lǐng)域來(lái)說(shuō),尤其是在網(wǎng)絡(luò)領(lǐng)域,會(huì)話(session)是一種持久網(wǎng)絡(luò)協(xié)議,在用戶(或用戶代理)端和服務(wù)器端之間創(chuàng)建關(guān)聯(lián),從而起到交換數(shù)據(jù)包的作用機(jī)制,session在網(wǎng)絡(luò)協(xié)議(例如telnet或FTP)中是非常重要的部分。在不包含會(huì)話層(例如UDP)或者是無(wú)法長(zhǎng)時(shí)間駐留會(huì)話層(例如HTTP)的傳輸協(xié)議中,會(huì)話的維持需要依靠在傳輸數(shù)據(jù)中的高級(jí)別程序。例如,在瀏覽器和遠(yuǎn)程主機(jī)之間的HTTP傳輸中,HTTPcookie就會(huì)被用來(lái)包含一些相關(guān)的信息,例如sessionID,參數(shù)和權(quán)限信息等。當(dāng)客戶端在多個(gè)服務(wù)器調(diào)取數(shù)據(jù)時(shí),保持會(huì)話狀態(tài)的一致性是需要注意的,客戶端需用同時(shí)保持和某一個(gè)主機(jī)的連接,或者多個(gè)服務(wù)器端需要共享一個(gè)儲(chǔ)存會(huì)話信息的文件系統(tǒng)或者數(shù)據(jù)庫(kù)。否則,當(dāng)用戶在一個(gè)新的而不是一開始保存會(huì)話信息的主機(jī)上提交訪問請(qǐng)求的時(shí)候,主機(jī)會(huì)因?yàn)闊o(wú)法獲知原來(lái)主機(jī)的會(huì)話的訪問狀態(tài)而產(chǎn)生問題。CookieCookie(復(fù)數(shù)形態(tài)Cookies),中文名稱為小型文本文件或小甜餅,指某些網(wǎng)站為了辨別用戶身份而儲(chǔ)存在用戶本地終端(ClientSide)上的數(shù)據(jù)(通常經(jīng)過(guò)加密)。定義于RFC2109。為網(wǎng)景公司的前雇員LouMontulli在1993年3月所發(fā)明。HttpOnlyCookieHttpOnly是包含在Http響應(yīng)頭信息Set-Cookie中的一個(gè)額外標(biāo)志,如果瀏覽器支持HttpOnly標(biāo)志的話,在生成Cookie時(shí)使用HttpOnly標(biāo)志可幫助減輕客戶端腳本訪問受保護(hù)的Cookie時(shí)帶來(lái)的風(fēng)險(xiǎn)(客戶端腳本不能訪問HttpOnlyCookie)。安全編程原則統(tǒng)一的安全規(guī)范每個(gè)軟件項(xiàng)目在設(shè)計(jì)階段都應(yīng)明確在項(xiàng)目實(shí)施過(guò)程中項(xiàng)目組應(yīng)遵循的統(tǒng)一規(guī)范,具體包括:命名規(guī)則、組件使用規(guī)范、異常處理規(guī)范、日志處理規(guī)范、工具使用要求、代碼集成規(guī)范。針對(duì)本規(guī)范提出的主要代碼脆弱性應(yīng)進(jìn)行相應(yīng)的防范設(shè)計(jì),具體內(nèi)容應(yīng)在軟件概要設(shè)計(jì)中體現(xiàn)或有單獨(dú)的文檔體現(xiàn)。模塊劃分軟件應(yīng)該按照安全性劃分模塊,審計(jì)和訪問控制模塊為安全可信模塊,其它模塊為不可信任模塊。只有安全可信模塊才可以執(zhí)行安全控制功能,其它的模塊不能訪問安全可信模塊的安全信息、功能或者權(quán)限。安全可信模塊應(yīng)該與其它模塊分離,由經(jīng)授權(quán)的內(nèi)部專人進(jìn)行管理。只有安全可信模塊,才能以高安全等級(jí)訪問系統(tǒng)的敏感信息,對(duì)于其他模塊限制其訪問敏感信息。最小化功能根據(jù)“沒有明確允許的就默認(rèn)禁止”的原則,軟件應(yīng)只包含那些為達(dá)到某個(gè)目標(biāo)而確實(shí)需要的功能,不應(yīng)包含只是在將來(lái)某個(gè)時(shí)間需要但需求說(shuō)明書中沒有的功能。軟件在最小化功能建設(shè)方面應(yīng)遵循如下原則:只運(yùn)行明確定義的功能。系統(tǒng)調(diào)用只在確實(shí)需要的時(shí)候。一次只執(zhí)行一個(gè)任務(wù)。只有在上一個(gè)任務(wù)完成后才開始下一個(gè)任務(wù)。只在確實(shí)需要的時(shí)候訪問數(shù)據(jù)。最小化特權(quán)只為程序中需要特權(quán)的部分授與特權(quán)。只授與部分絕對(duì)需要的具體特權(quán)。將特權(quán)的有效時(shí)間或者可以有效的時(shí)間限制到絕對(duì)最小。對(duì)多任務(wù)、多進(jìn)程加以關(guān)注軟件開發(fā)應(yīng)盡量使用單任務(wù)的程序。如果軟件需要使用多任務(wù)和多進(jìn)程,應(yīng)該認(rèn)真分析研究多任務(wù)和多進(jìn)程會(huì)不會(huì)發(fā)生沖突,同步所有的進(jìn)程和任務(wù)以避免沖突。同時(shí)作為結(jié)構(gòu)化的編程,每個(gè)原子化組件都要保證一個(gè)入口和一個(gè)出口。如果進(jìn)程之間需要交互,則這些交互操作應(yīng)同步。對(duì)于每一種可能的交互情況都要考慮相關(guān)的安全策略。界面輸出最小化軟件應(yīng)保持用戶界面只提供必須的功能,沒有多余的、不必要的功能,確保用戶不能通過(guò)用戶界面直接訪問數(shù)據(jù)或者直接訪問被保護(hù)對(duì)象。使代碼簡(jiǎn)單、最小化和易于修改開發(fā)時(shí)應(yīng)盡量使代碼簡(jiǎn)單、最小化和易于修改。使用結(jié)構(gòu)化的編程語(yǔ)言,盡量避免使用遞歸和Goto聲明。使用簡(jiǎn)單的代碼,清除不必要的功能,防止采用信息隱藏方式進(jìn)行數(shù)據(jù)保護(hù)。避免高危的服務(wù)、協(xié)議軟件應(yīng)盡量避免使用不加保護(hù)的及已被證明存在安全漏洞的服務(wù)和通信協(xié)議傳輸文件,如FTP、SMTP。數(shù)據(jù)和代碼分離軟件應(yīng)該把數(shù)據(jù)與程序放置在不同的目錄中,這里的數(shù)據(jù)包括遠(yuǎn)程下載文件等。關(guān)鍵數(shù)據(jù)傳輸保護(hù)軟件在傳輸關(guān)鍵數(shù)據(jù)時(shí),使用加密算法保證數(shù)據(jù)在通信過(guò)程不被破譯,使用數(shù)字簽名保證數(shù)據(jù)在傳輸過(guò)程中的一致性和不可否認(rèn)性。相關(guān)的加密算法和簽名技術(shù)等應(yīng)符合國(guó)家相關(guān)法律法規(guī)要求。信息隱藏是不可靠、效率低的做法,軟件應(yīng)該使用正確的安全保護(hù)措施,不要依賴隱藏進(jìn)行數(shù)據(jù)保護(hù)。禁止賦予用戶進(jìn)程特權(quán)用戶進(jìn)程的授權(quán)應(yīng)采用最小授權(quán)法,對(duì)于軟件的普通用戶進(jìn)程,禁止賦予該類進(jìn)程特權(quán)用戶權(quán)限。特權(quán)用戶類型包括:超級(jí)用戶。直接操作數(shù)據(jù)庫(kù)用戶。安全管理用戶。使用適當(dāng)?shù)臄?shù)據(jù)類型應(yīng)該小心使用數(shù)據(jù)類型,盡量使用占用內(nèi)存較小的數(shù)據(jù)類型,如可用整型數(shù)據(jù)的不用實(shí)型,特別是在程序接口部分。例如,在一些編程語(yǔ)言中signed和unsigned的數(shù)據(jù)類型是視為不同的(如C或者C++語(yǔ)言)。使用經(jīng)過(guò)驗(yàn)證的安全代碼使用經(jīng)過(guò)驗(yàn)證的安全代碼模塊和外部源程序,防止?jié)撛诘陌踩L(fēng)險(xiǎn)。使用應(yīng)用中間件中間件作為一種應(yīng)用層架構(gòu),軟件設(shè)計(jì)應(yīng)盡可能使用中間件,中間件選型時(shí)應(yīng)選擇成熟的、業(yè)界主流的中間件產(chǎn)品。設(shè)計(jì)錯(cuò)誤、異常處理機(jī)制軟件設(shè)計(jì)開發(fā)時(shí)應(yīng)建立防止系統(tǒng)死鎖的機(jī)制,異常情況的處理和恢復(fù)機(jī)制,具體包括錯(cuò)誤和異常檢測(cè)、數(shù)據(jù)回滾、安全錯(cuò)誤通知、錯(cuò)誤和異常記錄、斷點(diǎn)保護(hù)等。提供備份機(jī)制為保證運(yùn)行數(shù)據(jù)的完整性和可用性,軟件開發(fā)應(yīng)設(shè)計(jì)有效的備份策略,根據(jù)業(yè)務(wù)和系統(tǒng)維護(hù)需要提供定期或不定期、自動(dòng)或手動(dòng)方式的備份機(jī)制。檢查傳遞變量的合法性應(yīng)檢查所有傳遞給系統(tǒng)函數(shù)調(diào)用(SystemCalls)或本地調(diào)用(NativeCalls)的變量的合法性。檢查所有函數(shù)返回代碼應(yīng)檢查所有函數(shù)調(diào)用返回代碼(錯(cuò)誤代碼),對(duì)每個(gè)期望的返回值設(shè)置相應(yīng)的處理程序。修改面向用戶的操作的反饋缺省描述應(yīng)對(duì)面向用戶的操作的反饋缺省描述進(jìn)行必要的封裝,刪除有關(guān)后臺(tái)系統(tǒng)或其它敏感信息。文件操作的要求在需要進(jìn)行文件操作時(shí),應(yīng)預(yù)先設(shè)定目前工作路徑(全路徑名),使用全路徑名表示文件的位置。其他編碼原則當(dāng)一個(gè)進(jìn)程對(duì)敏感對(duì)象(包含秘密信息或包含不可更改信息)使用完后,應(yīng)立即擦除對(duì)象的敏感信息,然后再刪除對(duì)象。任何不需要使用的資源應(yīng)及時(shí)釋放。確保所有用來(lái)指示數(shù)組下標(biāo)的數(shù)據(jù)(或指針)都指向了一個(gè)有效的數(shù)組元素。如果某個(gè)函數(shù)不能保證下標(biāo)所指向元素的有效性,或者根本不去檢查邊界時(shí),不要使用該函數(shù),應(yīng)該尋找一個(gè)安全的函數(shù),或者自己重新編寫一個(gè)或者封裝一個(gè)不安全的函數(shù),加上必要的判斷條件,使它安全。當(dāng)輸入不可信任數(shù)據(jù)時(shí),要在該數(shù)據(jù)的內(nèi)容和格式上同時(shí)加以檢查。對(duì)于整數(shù),應(yīng)該檢查數(shù)據(jù)大小是否超出了能夠表示的范圍;對(duì)于輸入的字符串,要確保長(zhǎng)度沒有溢出,保證每一個(gè)字符都是有效的。對(duì)經(jīng)常使用的類似的SQL語(yǔ)句應(yīng)使用綁定變量的方法,避免數(shù)據(jù)庫(kù)執(zhí)行類似SQL語(yǔ)句時(shí)重復(fù)解析、重復(fù)訪問數(shù)據(jù)文件的行為。程序編碼結(jié)束后,應(yīng)對(duì)代碼進(jìn)行優(yōu)化,提高應(yīng)用處理SQL的性能。禁止使用通配符的方式進(jìn)行數(shù)據(jù)的插入操作。采用數(shù)據(jù)庫(kù)作為系統(tǒng)間接口方式時(shí),應(yīng)建立獨(dú)立的接口表,并按最小化特權(quán)原則進(jìn)行授權(quán)。應(yīng)用安全分析安全需求系統(tǒng)安全本質(zhì)上屬于信任問題,要保證應(yīng)用安全,就必須將解決各種操作過(guò)程中不可信問題。安全的幾個(gè)基本要素為機(jī)密性、完整性、可用性、可審計(jì)性、不可抵賴性等方面的安全要求。機(jī)密性要求保護(hù)數(shù)據(jù)內(nèi)容不能泄露,加密是實(shí)現(xiàn)機(jī)密性的要求的常見手段。完整性要求保護(hù)數(shù)據(jù)內(nèi)容是完整、沒有被篡改的。可用性要求保護(hù)資源是可被按照需要訪問。可審計(jì)性對(duì)出現(xiàn)的安全問題提供調(diào)查的依據(jù)和手段。不可抵賴性建立有效的責(zé)任機(jī)制,防止用戶否認(rèn)其行為。安全威脅Web安全漏洞根據(jù)結(jié)合國(guó)網(wǎng)系統(tǒng)安全檢測(cè)項(xiàng)目常見安全問題及OWASP組織發(fā)布的安全漏洞,系統(tǒng)中存在的需要解決的安全風(fēng)險(xiǎn)如下:序號(hào)安全威脅產(chǎn)生環(huán)節(jié)1SQL注入編碼2失效的身份認(rèn)證及會(huì)話管理設(shè)計(jì)、編碼3跨站腳本(XSS)編碼4點(diǎn)擊劫持(ClickJacking)編碼4不安全的直接對(duì)象引用編碼5安全配置錯(cuò)誤配置實(shí)施6敏感信息泄露設(shè)計(jì)、編碼7功能級(jí)訪問控制缺失(失敗的URL訪問權(quán)限限制)設(shè)計(jì)8跨站請(qǐng)求偽造(CSRF)編碼9使用含有已知漏洞的組件管理、設(shè)計(jì)10未驗(yàn)證的重定向和轉(zhuǎn)發(fā)編碼11傳輸層保護(hù)不足設(shè)計(jì)、編碼12文件上傳漏洞編碼13不安全的加密存儲(chǔ)設(shè)計(jì)、編碼拒絕服務(wù)攻擊分布式拒絕服務(wù)攻擊(英文:DistributedDenialofService,縮寫:DDoS)亦稱洪水攻擊。顧名思義,即是利用網(wǎng)絡(luò)上已被攻陷的電腦作為“僵尸”,向某一特定的目標(biāo)電腦發(fā)動(dòng)密集式的“拒絕服務(wù)”式攻擊,用以把目標(biāo)電腦的網(wǎng)絡(luò)資源及系統(tǒng)資源耗盡,使之無(wú)法向真正正常請(qǐng)求的用戶提供服務(wù)。黑客通過(guò)將一個(gè)個(gè)“喪尸”或者稱為“肉雞”組成僵尸網(wǎng)絡(luò),就可以發(fā)動(dòng)大規(guī)模DDoS或SYN洪水網(wǎng)絡(luò)攻擊,或者將“喪尸”們組到一起進(jìn)行帶有利益的刷網(wǎng)站流量、Email垃圾郵件群發(fā),癱瘓預(yù)定目標(biāo)受雇攻擊競(jìng)爭(zhēng)對(duì)手等商業(yè)活動(dòng)。嗅探攻擊利用計(jì)算機(jī)的網(wǎng)絡(luò)接口截獲目的地為其他計(jì)算機(jī)的數(shù)據(jù)報(bào)文的一種技術(shù)。它工作在網(wǎng)絡(luò)的底層,把網(wǎng)絡(luò)傳輸?shù)娜繑?shù)據(jù)記錄下來(lái).嗅探器可以幫助網(wǎng)絡(luò)管理員查找網(wǎng)絡(luò)漏洞和檢測(cè)網(wǎng)絡(luò)性能。嗅探器可以分析網(wǎng)絡(luò)的流量,以便找出所關(guān)心的網(wǎng)絡(luò)中潛在的問題。證明你的網(wǎng)絡(luò)有嗅探器有兩條經(jīng)驗(yàn):網(wǎng)絡(luò)通訊丟包率非常高:通過(guò)一些網(wǎng)管軟件,可以看到信息包傳送情況,最簡(jiǎn)單是ping命令。它會(huì)告訴你掉了百分之多少的包。如果你的網(wǎng)絡(luò)結(jié)構(gòu)正常,而又有20%-30%數(shù)據(jù)包丟失以致數(shù)據(jù)包無(wú)法順暢的流到目的地。就有可能有人在監(jiān)聽,這是由于嗅探器攔截?cái)?shù)據(jù)包導(dǎo)致的。網(wǎng)絡(luò)帶寬出現(xiàn)反常:通過(guò)某些帶寬控制器,可以實(shí)時(shí)看到目前網(wǎng)絡(luò)帶寬的分布情況,如果某臺(tái)機(jī)器長(zhǎng)時(shí)間的占用了較大的帶寬,這臺(tái)機(jī)器就有可能在監(jiān)聽。應(yīng)該也可以察覺出網(wǎng)絡(luò)通訊速度的變化。中間人攻擊在密碼學(xué)和計(jì)算機(jī)安全領(lǐng)域中,中間人攻擊(Man-in-the-middleattack,通??s寫為MITM)是指攻擊者與通訊的兩端分別建立獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通訊的兩端認(rèn)為他們正在通過(guò)一個(gè)私密的連接與對(duì)方直接對(duì)話,但事實(shí)上整個(gè)會(huì)話都被攻擊者完全控制。在中間人攻擊中,攻擊者可以攔截通訊雙方的通話并插入新的內(nèi)容。在許多情況下這是很簡(jiǎn)單的(例如,在一個(gè)未加密的Wi-Fi無(wú)線接入點(diǎn)的接受范圍內(nèi)的中間人攻擊者,可以將自己作為一個(gè)中間人插入這個(gè)網(wǎng)絡(luò))。一個(gè)中間人攻擊能成功的前提條件是攻擊者能將自己偽裝成每一個(gè)參與會(huì)話的終端,并且不被其他終端識(shí)破。中間人攻擊是一個(gè)(缺乏)相互認(rèn)證的攻擊。大多數(shù)的加密協(xié)議都專門加入了一些特殊的認(rèn)證方法以阻止中間人攻擊。例如,SSL協(xié)議可以驗(yàn)證參與通訊的一方或雙方使用的證書是否是由權(quán)威的受信任的數(shù)字證書認(rèn)證機(jī)構(gòu)頒發(fā),并且能執(zhí)行雙向身份認(rèn)證。安全約束序號(hào)限制1外網(wǎng)不允許部署數(shù)據(jù)庫(kù)2外網(wǎng)僅提供HTTP、HTTPS訪問,不提供等3外網(wǎng)訪問內(nèi)網(wǎng)必須通過(guò)強(qiáng)隔離裝置,僅支持TNS協(xié)議(國(guó)網(wǎng)系統(tǒng)要求)4外網(wǎng)應(yīng)用不允許直接訪問內(nèi)網(wǎng)關(guān)鍵業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫(kù)5其它系統(tǒng)原則上都不允許直接連接營(yíng)銷系統(tǒng)數(shù)據(jù)庫(kù)安全編程要求輸入處理建立可信邊界需要在程序中定義清晰的可信邊界。在一些代碼中用于保存可信數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),不能被用來(lái)在其它代碼中存儲(chǔ)不可信數(shù)據(jù)。使數(shù)據(jù)穿越可信邊界的次數(shù)降到最低。當(dāng)程序混淆了可信和不可信數(shù)據(jù)的界限時(shí)會(huì)導(dǎo)致安全邊界發(fā)生問題,最容易導(dǎo)致這種錯(cuò)誤的情況是把可信和不可信數(shù)據(jù)混合在一個(gè)數(shù)據(jù)結(jié)構(gòu)里。如下例:該例中程序接受一個(gè)http請(qǐng)求并將"usrname"參數(shù)放在HTTPsession里,但是并未檢查用戶是否被授權(quán)。usrname=request.getParameter("usrname");usrname=request.getParameter("usrname");if(session.getAttribute(ATTR_USR)==null){ session.setAttribute(ATTR_USR,usrname);}由于開發(fā)者都知道用戶是不能直接訪問session對(duì)象的,所以很容易信任來(lái)自session的所有信息,但是如果在該session中混合存儲(chǔ)了可信和不可信的數(shù)據(jù),就會(huì)違反完全可信邊界的原則,帶來(lái)安全隱患。如果不能很好的建立和維護(hù)可信邊界,開發(fā)者將不可避免的混淆未被驗(yàn)證和已驗(yàn)證的數(shù)據(jù),從而導(dǎo)致一些數(shù)據(jù)在未經(jīng)驗(yàn)證時(shí)就被使用。如果輸入的數(shù)據(jù)在處理前通過(guò)一些用戶的交互發(fā)生了改變,可信邊界就會(huì)遇到一定的問題,因?yàn)樗芸赡茉谒袛?shù)據(jù)進(jìn)入之前不能做出完全的輸入驗(yàn)證。在這種情況下,維護(hù)一個(gè)可信的邊界就尤為重要,不可信數(shù)據(jù)應(yīng)該單獨(dú)存放在專門存放不可信數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)內(nèi),在經(jīng)過(guò)驗(yàn)證之后才被放在可信區(qū)域。這樣在看一段代碼時(shí),就很容易識(shí)別數(shù)據(jù)是在可信邊界的哪一側(cè)。驗(yàn)證各種來(lái)源的輸入不要將軟件的安全性寄托在配置、使用和維護(hù)人員的敏銳理解力、深刻洞察力或良好意愿上,不僅需要驗(yàn)證用戶輸入,而且還要驗(yàn)證所有來(lái)自于軟件之外的輸入,這些輸入應(yīng)當(dāng)包括下列內(nèi)容,但并不僅僅局限于此:HTTP請(qǐng)求消息的全部字段,包括GET數(shù)據(jù)、POST數(shù)據(jù)、COOKIE和Header數(shù)據(jù)等。不可信來(lái)源的文件。第三方接口數(shù)據(jù)。從數(shù)據(jù)庫(kù)中檢索出的數(shù)據(jù)。對(duì)來(lái)自命令行、環(huán)境以及配置文件的輸入。網(wǎng)絡(luò)服務(wù)。注冊(cè)表值。系統(tǒng)性能參數(shù)。臨時(shí)文件。保證所有的輸入信息是被驗(yàn)證過(guò)的確保在輸入驗(yàn)證之前,新輸入的數(shù)據(jù)不能被添加到程序中(輸入的數(shù)據(jù)不能進(jìn)入程序代碼中被執(zhí)行)。也就是說(shuō),程序默認(rèn)情況下要對(duì)所有的輸入信息進(jìn)行驗(yàn)證,不能通過(guò)驗(yàn)證的數(shù)據(jù)將會(huì)被拒絕。對(duì)輸入內(nèi)容進(jìn)行規(guī)范化處理后再進(jìn)行驗(yàn)證當(dāng)輸入數(shù)據(jù)包含文件名、路徑名、URL等數(shù)據(jù)時(shí),應(yīng)先對(duì)輸入內(nèi)容進(jìn)行規(guī)范化處理后再進(jìn)行驗(yàn)證,如文件路徑、URL地址等數(shù)據(jù),需要規(guī)范化為標(biāo)準(zhǔn)的格式后再進(jìn)行驗(yàn)證。選擇合適的數(shù)據(jù)驗(yàn)證方式應(yīng)根據(jù)情況綜合采用多種輸入驗(yàn)證的方法,包括:檢查數(shù)據(jù)是否符合期望的類型。檢查數(shù)據(jù)是否符合期望的長(zhǎng)度。檢查數(shù)值數(shù)據(jù)是否符合期望的數(shù)值范圍,比如檢測(cè)整數(shù)輸入的最大值與最小值。檢查數(shù)據(jù)是否包含特殊字符,如:、"、'、%、(、)、&、+、\、\'、\"等。應(yīng)使用正則表達(dá)式進(jìn)行白名單檢查盡量避免使用黑名單法。防范元字符攻擊攻擊者通常會(huì)使用元字符對(duì)應(yīng)用程序發(fā)起攻擊。攻擊者可以通過(guò)對(duì)同一個(gè)元字符采取多種編碼方式或者根據(jù)語(yǔ)言特征采取多種實(shí)現(xiàn)方式,因此應(yīng)過(guò)濾輸入數(shù)據(jù)中那些具有特定含義的字符,如單引號(hào)、雙引號(hào)、圓括號(hào)、分號(hào)等。拒絕驗(yàn)證失敗的數(shù)據(jù)應(yīng)拒絕驗(yàn)證失敗的輸入數(shù)據(jù),不試圖對(duì)其進(jìn)行修復(fù)(如處理密碼域時(shí)自動(dòng)剪裁掉超過(guò)最大長(zhǎng)度的輸入,替換掉在輸入框輸入的JavaScript字符等)。輸入驗(yàn)證本身就很復(fù)雜,如果和自動(dòng)錯(cuò)誤恢復(fù)的代碼混合在一起的話,將會(huì)造成更大的復(fù)雜性,自動(dòng)錯(cuò)誤恢復(fù)代碼很可能改變請(qǐng)求的含義或者截?cái)囹?yàn)證邏輯。如果我們能夠引導(dǎo)用戶,使他們提交的請(qǐng)求能夠通過(guò)輸入驗(yàn)證,就會(huì)比專注于自動(dòng)錯(cuò)誤恢復(fù)代碼有效得多。在驗(yàn)證失敗時(shí),安全的做法是不試圖修復(fù)一個(gè)未能通過(guò)輸入驗(yàn)證的請(qǐng)求,直接拒絕掉。在服務(wù)端進(jìn)行驗(yàn)證僅在客戶端進(jìn)行驗(yàn)證是不安全的,尤其是在WEB應(yīng)用系統(tǒng)中,客戶端的驗(yàn)證大多采用腳本(如JavaScript)來(lái)完成,客戶端的驗(yàn)證很容易被繞過(guò),安全的做法是在客戶端驗(yàn)證的同時(shí),在服務(wù)器端也進(jìn)行驗(yàn)證。建立統(tǒng)一的輸入驗(yàn)證接口應(yīng)建立統(tǒng)一的輸入驗(yàn)證接口,為整個(gè)應(yīng)用系統(tǒng)提供一致的驗(yàn)證方法,這樣可以避免分散驗(yàn)證帶來(lái)的代碼管理混亂,并且可以減少遺漏??刂茖懭肴罩镜男畔⒂捎谌罩緮?shù)據(jù)的價(jià)值,它也成為了攻擊者的目標(biāo)。如果攻擊者可以控制寫進(jìn)日志文件的信息,他們就可以在輸入中混入偽造的日志條目來(lái)偽造系統(tǒng)事件,更嚴(yán)重的是,如果負(fù)責(zé)進(jìn)行日志分析的代碼存在漏洞,特定的有惡意的輸入數(shù)據(jù)很可能觸發(fā)該漏洞,并引發(fā)更加嚴(yán)重的危害。如果日志數(shù)據(jù)中包含輸入數(shù)據(jù),應(yīng)對(duì)輸入數(shù)據(jù)進(jìn)行驗(yàn)證,禁止攻擊者能夠?qū)懭我獾臄?shù)據(jù)到日志中。從服務(wù)器端提取關(guān)鍵參數(shù)需要獲取參數(shù)時(shí),應(yīng)當(dāng)從服務(wù)器端提取關(guān)鍵參數(shù),禁止從客戶端輸入,例如產(chǎn)品價(jià)格、用戶角色、鑒權(quán)標(biāo)志等,如果關(guān)鍵參數(shù)允許從客戶端輸入提供,攻擊者可通過(guò)偽造或篡改輸入數(shù)據(jù)造成程序關(guān)鍵邏輯錯(cuò)誤。輸出處理限制返回給客戶的信息編碼時(shí)應(yīng)該限制返回給客戶與業(yè)務(wù)處理無(wú)關(guān)的信息,禁止把重點(diǎn)保護(hù)數(shù)據(jù)返回給不信任的用戶,避免信息外泄。建立錯(cuò)誤信息保護(hù)機(jī)制開發(fā)人員在編碼時(shí),禁止將詳細(xì)錯(cuò)誤信息直接反饋到客戶端,詳細(xì)錯(cuò)誤信息中包含系統(tǒng)信息、文件和目錄的絕對(duì)路徑信息,應(yīng)對(duì)錯(cuò)誤信息進(jìn)行規(guī)整和清理后再返回到客戶端,建議只向客戶端返回錯(cuò)誤碼,詳細(xì)錯(cuò)誤信息可以記錄在后臺(tái)服務(wù)器。數(shù)據(jù)庫(kù)訪問合理分配數(shù)據(jù)庫(kù)訪問權(quán)限應(yīng)按照“最小化原則”為應(yīng)用程序分配數(shù)據(jù)庫(kù)訪問權(quán)限。避免為應(yīng)用程序分配過(guò)大或不必要的數(shù)據(jù)庫(kù)權(quán)限,禁止將數(shù)據(jù)庫(kù)DBA權(quán)限分配給應(yīng)用程序。合理存放數(shù)據(jù)庫(kù)連接帳號(hào)和密碼信息禁止在應(yīng)用程序代碼和配置文件明文存放數(shù)據(jù)庫(kù)連接帳號(hào)和密碼信息,建議對(duì)數(shù)據(jù)庫(kù)連接賬戶和密碼信息加密后再保存在配置文件中。使用參數(shù)化請(qǐng)求方式使用參數(shù)化的SQL請(qǐng)求是防止SQL注入的有效方法。導(dǎo)致SQL注入漏洞的原因就是攻擊者可以改變SQL請(qǐng)求的內(nèi)容,攻擊者提交的數(shù)據(jù)變成了SQL執(zhí)行命令的一部分。在構(gòu)造SQL請(qǐng)求時(shí),開發(fā)者應(yīng)當(dāng)知道哪些應(yīng)該被翻譯為數(shù)據(jù)而哪些應(yīng)該被翻譯為命令的一部分。如果正確的使用參數(shù)化的SQL語(yǔ)句,就可以通過(guò)不允許數(shù)據(jù)指向改變的方法來(lái)防御幾乎所有的SQL注入攻擊。參數(shù)化的SQL語(yǔ)句通常是由SQL字符構(gòu)造的,但是來(lái)自客戶的數(shù)據(jù)是需要與一些綁定參數(shù)組合在一起的。也就是說(shuō),開發(fā)者使用這些綁定參數(shù)來(lái)準(zhǔn)確的向數(shù)據(jù)庫(kù)指出哪些應(yīng)該被當(dāng)作數(shù)據(jù),哪些應(yīng)該被當(dāng)作命令。當(dāng)程序要執(zhí)行該語(yǔ)句的時(shí)候,它就會(huì)告知數(shù)據(jù)庫(kù)這些綁定參數(shù)的運(yùn)行值,這樣就避免了數(shù)據(jù)被認(rèn)為是命令語(yǔ)句而被執(zhí)行的錯(cuò)誤。但是,如下是SQL請(qǐng)求中包含字符串拼接造成SQL注入漏洞的例子:這是一個(gè)javaweb應(yīng)用程序,讓用戶在數(shù)據(jù)庫(kù)中搜索一些信息,用戶可以指定要搜尋的對(duì)象名稱,并用以下代碼執(zhí)行這些查詢:Stringitem=request.getParamater("item");Stringq="SELECT*FROMrecordsWHEREitem="+item;PreparedStatementstmt=conn.prepareStatement(q);ResultSetresults=stmt.execute();...雖然本例程序使用了參數(shù)化的接口,但是它犯了一個(gè)很常見的錯(cuò)誤:把用戶的輸入作為prepareStatement()的參數(shù)傳入,如果允許用戶控制PreparedStatement的內(nèi)容,參數(shù)化SQL提供的安全特性就會(huì)失去效果,很多SQL注入攻擊的關(guān)鍵字也會(huì)被包含在之前構(gòu)造的語(yǔ)句中。合理的使用參數(shù)化SQL代碼如下:Stringitem=request.getParamater("item");Stringq="SELECT*FROMrecordsWHEREitem=?";PreparedStatementstmt=conn.prepareStatement(q);stmt.setString(1,item);ResultSetresults=stmt.execute();...對(duì)SQL語(yǔ)句中來(lái)自于不可信區(qū)域的輸入?yún)?shù)進(jìn)行驗(yàn)證在一些復(fù)雜的情況會(huì)出現(xiàn)要求輸入影響SQL語(yǔ)句結(jié)構(gòu)的情況,譬如要求在where子句里增加一個(gè)動(dòng)態(tài)約束,這時(shí)應(yīng)對(duì)來(lái)自不可信區(qū)域的輸入?yún)?shù)進(jìn)行驗(yàn)證。對(duì)數(shù)據(jù)庫(kù)操作的返回?cái)?shù)據(jù)進(jìn)行驗(yàn)證不應(yīng)盲目信任來(lái)自數(shù)據(jù)庫(kù)的數(shù)據(jù),建議對(duì)來(lái)自數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行驗(yàn)證,確保其格式正確且能夠安全的使用:檢查SQL請(qǐng)求的返回記錄數(shù),SQL請(qǐng)求的預(yù)期結(jié)果為單值數(shù)據(jù),但存在多行結(jié)果時(shí),表明SQL請(qǐng)求中被可能被攻擊者插入了注入語(yǔ)句,此時(shí)應(yīng)中止后續(xù)處理并記錄日志。將來(lái)自數(shù)據(jù)庫(kù)的數(shù)據(jù)做為輸入數(shù)據(jù)時(shí),也應(yīng)進(jìn)行驗(yàn)證。分次提取數(shù)據(jù)對(duì)于數(shù)據(jù)庫(kù)查詢操作,如果查詢返回的結(jié)果較多時(shí),應(yīng)設(shè)計(jì)成分次提取,應(yīng)避免一次提取過(guò)多數(shù)據(jù)。通過(guò)row(行)級(jí)別的訪問控制來(lái)使用數(shù)據(jù)庫(kù)不要依賴應(yīng)用程序訪問控制能夠保護(hù)數(shù)據(jù)庫(kù)的數(shù)據(jù),限制每個(gè)請(qǐng)求使用戶只能訪問他們自己的數(shù)據(jù)。通過(guò)row級(jí)別的訪問控制是防止用戶信息泄露的“最后的防線”了。限制SQL請(qǐng)求只向當(dāng)前認(rèn)證的用戶返回結(jié)果。當(dāng)用戶要執(zhí)行SQL語(yǔ)句時(shí),根據(jù)用戶提交的用戶名或者ID進(jìn)行判斷是否具有執(zhí)行該SQL語(yǔ)句操作的權(quán)限,來(lái)限制攻擊者越權(quán)來(lái)執(zhí)行SQL語(yǔ)句。確保數(shù)據(jù)庫(kù)資源被釋放保證數(shù)據(jù)庫(kù)訪問在不需要使用的時(shí)候被釋放,例如連接、游標(biāo)等。由于資源泄露會(huì)導(dǎo)致系統(tǒng)出錯(cuò)而且很難捕捉到,所以我們建議建立一個(gè)資源管理模塊并且完全按照規(guī)則進(jìn)行操作。禁止依賴Java和.NET的垃圾回收器來(lái)回收資源,在Java中,應(yīng)該在finally塊中釋放資源來(lái)保證資源在任何環(huán)境下都會(huì)被釋放。在.NET中,則需要使用關(guān)鍵字using引入IDisposable接口來(lái)進(jìn)行資源釋放,而不是直接關(guān)閉管理資源的對(duì)象。文件操作對(duì)上傳文件進(jìn)行限制允許用戶上傳文件時(shí),應(yīng)對(duì)上傳文件做如下限制:上傳文件類型限制應(yīng)遵循最小化原則,通過(guò)文件檢查僅允許上傳必須的文件類型。上傳文件大小限制,限制文件的容量大小范圍。文件保存路徑限制,過(guò)濾文件名或路徑名中的特殊字符(../或..\等)避免文件保存在非預(yù)期目錄中。應(yīng)關(guān)閉文件上傳目錄的執(zhí)行權(quán)限,在UNIX/LINUX系統(tǒng)環(huán)境里,建議把上傳目錄掛載成獨(dú)立的邏輯盤或設(shè)置為JAIL環(huán)境。把文件名以及文件內(nèi)容作為不可信的輸入對(duì)待對(duì)來(lái)自文件系統(tǒng)的所有值都應(yīng)進(jìn)行合適的輸入驗(yàn)證,確保從文件系統(tǒng)中讀取的數(shù)據(jù)符合期望。安全的使用文件名應(yīng)避免在傳遞的參數(shù)中直接使用真實(shí)的文件名,盡量使用索引值來(lái)映射實(shí)際的文件路徑。如確實(shí)需要在參數(shù)中出現(xiàn)文件名,則盡量對(duì)文件名進(jìn)行白名單檢查。禁止在參數(shù)中出現(xiàn)../、..\等特殊字串及其變形。使用文件系統(tǒng)訪問控制由于文件系統(tǒng)是一個(gè)被多個(gè)用戶共享的系統(tǒng),這就要求以最嚴(yán)格的權(quán)限來(lái)保護(hù)保存在其中的資源。這意味著文件只應(yīng)被指定的用戶訪問,而且該用戶應(yīng)該被限制為最小權(quán)限,例如對(duì)文件的讀寫權(quán)限都應(yīng)被限制到最低。當(dāng)應(yīng)用程序使用被其控制的已存在文件時(shí),應(yīng)首先驗(yàn)證文件的權(quán)限和屬組,防止文件存在被篡改的許可權(quán)限。注意文件訪問競(jìng)爭(zhēng)條件多進(jìn)程或線程對(duì)同一文件進(jìn)行訪問時(shí),應(yīng)采取適當(dāng)?shù)募渔i策略保證文件數(shù)據(jù)在訪問過(guò)程中的一致性。安全使用臨時(shí)文件在程序初始化時(shí)以最嚴(yán)格的權(quán)限策略建立一個(gè)安全臨時(shí)文件夾,該文件夾只有該程序具備讀寫權(quán)限,其他用戶無(wú)法訪問。將所有臨時(shí)文件都存放在該文件夾中,當(dāng)臨時(shí)文件使用完畢后應(yīng)及時(shí)清除臨時(shí)文件。確保文件系統(tǒng)資源被釋放應(yīng)保證諸如文件句柄之類的文件系統(tǒng)訪問結(jié)構(gòu)在不再需要時(shí)會(huì)被及時(shí)釋放。不要依賴Java和.NET的垃圾回收器來(lái)回收資源。在Java中,應(yīng)該在finally塊中釋放資源來(lái)保證資源在任何情況下都會(huì)被釋放。在.NET中,則需要使用關(guān)鍵字using引入IDisposable接口來(lái)進(jìn)行資源釋放,而不是直接關(guān)閉管理資源的對(duì)象。安全特征關(guān)注應(yīng)用的對(duì)象重用對(duì)于底層系統(tǒng)的對(duì)象可重用性來(lái)說(shuō),應(yīng)用軟件需要提供對(duì)敏感數(shù)據(jù)使用后立即覆蓋的能力,這些敏感數(shù)據(jù)包括口令、安全密鑰、會(huì)話密鑰或者其它的高度敏感的數(shù)據(jù)。應(yīng)提高代碼的重復(fù)利用率,創(chuàng)建公共函數(shù)庫(kù)(對(duì)象庫(kù))供整個(gè)軟件程序調(diào)用。用戶訪問控制信息的機(jī)密性禁止在程序代碼和配置文件中直接明文寫入用戶名和口令等用戶訪問控制信息。這些控制信息應(yīng)加密后存放在配置文件中。不要在客戶端存放敏感數(shù)據(jù)由于客戶端是不可信任的,軟件不要在客戶端存放敏感數(shù)據(jù)。特別注意在使用Cookie時(shí)不要把客戶重要信息儲(chǔ)存在客戶端。避免內(nèi)存溢出軟件設(shè)計(jì)開發(fā)中,為防止內(nèi)存溢出,應(yīng)注意以下事項(xiàng):在對(duì)緩存區(qū)填充數(shù)據(jù)時(shí)應(yīng)進(jìn)行邊界檢查,判斷是否超出分配的空間。對(duì)于數(shù)據(jù)庫(kù)查詢操作,如果查詢返回的結(jié)果較多時(shí),應(yīng)設(shè)計(jì)成分次提取。應(yīng)保證系統(tǒng)資源及時(shí)釋放和服務(wù)連接的及時(shí)關(guān)閉,應(yīng)顯式關(guān)閉、釋放使用過(guò)的資源(如連接對(duì)象、文件句柄等),不要依賴?yán)占?。軟件程序?yīng)檢查每次內(nèi)存分配是否失敗,并進(jìn)行處理。應(yīng)及時(shí)釋放內(nèi)存資源,防止內(nèi)存泄漏,但要避免重復(fù)內(nèi)存釋放。其他可能引起內(nèi)存溢出的情況。可配置數(shù)據(jù)保護(hù)限制非應(yīng)用軟件用戶訪問可配置數(shù)據(jù)。可采用系統(tǒng)訪問控制為配置數(shù)據(jù)文件設(shè)置嚴(yán)格的訪問權(quán)限,僅應(yīng)用程序可以訪問。禁止在源代碼中寫入口令應(yīng)將加密后的口令存儲(chǔ)在配置文件,數(shù)據(jù)庫(kù)或者其它外部數(shù)據(jù)源中。禁止將口令存儲(chǔ)在代碼中。把口令存儲(chǔ)在代碼中會(huì)導(dǎo)致任何人都可以獲得到存儲(chǔ)在代碼中的口令,同時(shí)口令寫在發(fā)布的軟件中,如果需要修改口令,則軟件必需要通過(guò)安裝程序補(bǔ)丁等方式替換程序文件,會(huì)造成口令難于修改。隨機(jī)數(shù)如果應(yīng)用程序需要隨機(jī)數(shù),需要找出一種合適的隨機(jī)數(shù)生成方法,要求其生成代價(jià)較小并且應(yīng)滿足安全需求。在Java中,建議使用SecureRandom類生成隨機(jī)數(shù),不要使用Random類。通常不需要設(shè)置種子數(shù)給SecureRandom,Java會(huì)自動(dòng)獲取一個(gè)信息熵比較平均的值。在C和C++中,避免使用標(biāo)準(zhǔn)的隨機(jī)數(shù)函數(shù),如rand(),srand(),srand48(),drand48(),lrand48(),random()和srandom()。在隨機(jī)數(shù)生成器中不要使用容易被猜到的種子。兩種最常見的選種錯(cuò)誤是使用空種子和使用日期作為種子。(對(duì)于Java來(lái)說(shuō),SecureRandom的默認(rèn)構(gòu)造方法可以正確的選種)。如果操作系統(tǒng)或者應(yīng)用程序使用的加密庫(kù)有一個(gè)真實(shí)的隨機(jī)源,那么應(yīng)使用該隨機(jī)源。在很多Unix平臺(tái)上,從/dev/urandom讀取16字節(jié)可以給出相當(dāng)高質(zhì)量的隨機(jī)序列,建議從/dev/urandom獲取隨機(jī)源。使用可信的密碼算法如果應(yīng)用程序需要加密、數(shù)字簽名、密鑰交換或者安全散列,應(yīng)使用一個(gè)成熟的算法,自己設(shè)計(jì)的密碼算法缺乏廣泛的驗(yàn)證。異常管理捕捉并處理異常:應(yīng)使用結(jié)構(gòu)化異常處理機(jī)制,捕捉并處理異?,F(xiàn)象。避免將應(yīng)用程序置于不協(xié)調(diào)的狀態(tài),該狀態(tài)可能會(huì)導(dǎo)致信息泄漏或拒絕服務(wù)攻擊。記錄詳細(xì)的錯(cuò)誤信息:應(yīng)在錯(cuò)誤日志中記錄詳細(xì)的錯(cuò)誤消息。應(yīng)向服務(wù)或應(yīng)用程序的客戶發(fā)送最少量的信息,確保沒有密碼或其他敏感數(shù)據(jù)。如一般性錯(cuò)誤消息和自定義錯(cuò)誤日志ID,隨后可以將這些信息映射到事件日志中的詳細(xì)消息。不要向客戶端泄漏信息:發(fā)生故障時(shí),嚴(yán)禁向客戶端泄漏信息,禁止暴露的內(nèi)容包括函數(shù)名以及調(diào)試內(nèi)部版本時(shí)出問題的詳細(xì)信息。應(yīng)向客戶端返回一般性錯(cuò)誤消息。可以將應(yīng)用程序設(shè)置為不向遠(yuǎn)程用戶顯示詳細(xì)錯(cuò)誤信息,也可以選擇將錯(cuò)誤重定向到應(yīng)用程序頁(yè)。應(yīng)捕捉所有未處理異常并將它們發(fā)送到一般錯(cuò)誤頁(yè)的頁(yè)級(jí)別或應(yīng)用程序級(jí)別上,創(chuàng)建全局錯(cuò)誤處理程序。應(yīng)用安全設(shè)計(jì)規(guī)范應(yīng)用安全規(guī)劃將應(yīng)用系統(tǒng)劃分為多個(gè)相對(duì)獨(dú)立的邏輯單元,按照邏輯單元的安全要求,規(guī)劃邏輯單元的部署區(qū)域以及訪問方式,確保邏輯單元的邊界訪問安全。數(shù)據(jù)安全等級(jí)劃分對(duì)應(yīng)用系統(tǒng)的數(shù)據(jù)進(jìn)行分析,區(qū)分出普通數(shù)據(jù)、敏感數(shù)據(jù)和保密數(shù)據(jù)等類型。普通數(shù)據(jù):凡是不涉及敏感信息的數(shù)據(jù)都屬于普通數(shù)據(jù),系統(tǒng)中大部分的數(shù)據(jù)都是屬于普通數(shù)據(jù),普通數(shù)據(jù)允許采用明文傳輸和明文存儲(chǔ)。敏感數(shù)據(jù):敏感數(shù)據(jù)涉及到重要信息,為防止在傳輸過(guò)程中被攔截竊取或遭到篡改,要求敏感數(shù)據(jù)在客戶端和服務(wù)端之間必須采用SSL/TLS協(xié)議進(jìn)行傳輸,保證數(shù)據(jù)的傳輸安全。敏感數(shù)據(jù)除了傳輸需要加密外,一般還要求對(duì)敏感數(shù)據(jù)新增和變更操作進(jìn)行審計(jì)。如:信用卡信息、支付交易等屬于敏感數(shù)據(jù)。保密數(shù)據(jù):凡是不允許使用明文存儲(chǔ)的數(shù)據(jù)都屬于保密數(shù)據(jù),保密數(shù)據(jù)除了必須滿足敏感數(shù)據(jù)對(duì)數(shù)據(jù)傳輸進(jìn)行加密和審計(jì)的要求外,還必須按照保密性的要求,在數(shù)據(jù)存儲(chǔ)之前對(duì)數(shù)據(jù)進(jìn)行加密,數(shù)據(jù)庫(kù)或文件中僅存儲(chǔ)加密后的數(shù)據(jù)。如:用戶口令、支付密碼、信用卡密碼等屬于保密數(shù)據(jù)。數(shù)據(jù)庫(kù)規(guī)劃用戶權(quán)限合理規(guī)劃數(shù)據(jù)庫(kù)用戶,避免因?yàn)闄?quán)限分配不當(dāng)引起的數(shù)據(jù)安全問題。數(shù)據(jù)源設(shè)計(jì)為事務(wù)執(zhí)行時(shí)間較長(zhǎng)的操作分配單獨(dú)的數(shù)據(jù)源,避免因?yàn)槭聞?wù)長(zhǎng)時(shí)間暫用數(shù)據(jù)連接而對(duì)其它功能造成影響。外部系統(tǒng)訪問外部系統(tǒng)需要直接訪問應(yīng)用的數(shù)據(jù)時(shí),應(yīng)單獨(dú)分配一個(gè)用戶,并按照最小權(quán)限原則僅分配外部系統(tǒng)所需的最小訪問權(quán)限。角色劃分對(duì)外網(wǎng)類應(yīng)用,必須預(yù)先定義外網(wǎng)用戶角色類型、各類角色的應(yīng)用場(chǎng)景,并按照缺省最小權(quán)限原則劃分角色權(quán)限。URL規(guī)劃對(duì)外網(wǎng)類應(yīng)用,按照用戶角色對(duì)應(yīng)權(quán)限類型對(duì)系統(tǒng)URL進(jìn)行規(guī)劃,各種不同權(quán)限功能對(duì)應(yīng)的URL按照各種不同的統(tǒng)一的URL規(guī)則進(jìn)行定義,具有不同訪問權(quán)限要求的URL路徑規(guī)則不應(yīng)混合在一起。如: 用戶個(gè)人空間對(duì)應(yīng)功能都在/user/路徑下管理員對(duì)應(yīng)的功能都在/admin/路徑下程序文件目錄規(guī)劃數(shù)據(jù)及程序分離遵守?cái)?shù)據(jù)文件和程序文件分離的原則,在應(yīng)用部署根及子目錄下不應(yīng)存放任何數(shù)據(jù)文件。靜態(tài)程序資源靜態(tài)程序資源應(yīng)統(tǒng)一存放在指定的目錄下,在靜態(tài)程序資源目錄下不要存放任何動(dòng)態(tài)資源、可執(zhí)行文件、數(shù)據(jù)及任何無(wú)關(guān)資源。程序文件分類程序文件分為可直接被客戶端請(qǐng)求訪問的文件以及無(wú)法從客戶端直接訪問的文件,應(yīng)對(duì)程序文件進(jìn)行劃分,將不同的程序文件存放在不同的目錄下。如果不希望某個(gè)程序文件能被客戶端輸入文件路徑后被直接,應(yīng)該將這些文件放在WEB-INF目錄下。否則WEB-INF目錄之外的文件都可以通過(guò)客戶端輸入U(xiǎn)RL直接訪問或下載。CookieCookie的使用必須做統(tǒng)一的分析和管理,并按照Cookie存儲(chǔ)的數(shù)據(jù)重要程序及使用場(chǎng)景做劃分。禁止被客戶端Javascript及applet等操作必須通過(guò)Https在客戶端和服務(wù)端之間傳輸僅對(duì)當(dāng)前會(huì)話有效,瀏覽器關(guān)閉后即失效允許存儲(chǔ)在客戶端本地文件安全文件存儲(chǔ)系統(tǒng)運(yùn)行過(guò)程中生成的正式文件必須存儲(chǔ)在專門的文件服務(wù)器上,并要設(shè)置安全訪問策略。文件操作外網(wǎng)文件操作必須通過(guò)HTTP協(xié)議提供的WebDAV完成,不要使用FTP等文件傳輸協(xié)議。并且不允許直接對(duì)外開放文件服務(wù)器的訪問權(quán)限,文件訪問因通過(guò)應(yīng)用服務(wù)器中轉(zhuǎn)完成。文件類型必須明確指定應(yīng)用系統(tǒng)中允許上傳的文件類型。第三方組件安全組件兼容性所以引入的第三方組件都必須確保組件與平臺(tái)之間的兼容性,避免引入組件后引起平臺(tái)及現(xiàn)有組件崩潰、無(wú)法運(yùn)行、出現(xiàn)BUG等問題。組件安全及成熟度對(duì)第三方組件的成熟度及安全做評(píng)估,確保第三方組件不存在已知的未解決的安全漏洞,并且有成熟的社區(qū)在對(duì)組件升級(jí)和維護(hù),當(dāng)組件出現(xiàn)新的安全漏洞時(shí),能被及時(shí)解決。組件配置必須按照安全的方式對(duì)組件進(jìn)行集成和配置,避免出現(xiàn)因?yàn)榕渲煤褪褂貌划?dāng)引起的安全漏洞。WebService1.必須對(duì)WebService接口的調(diào)用必須進(jìn)行認(rèn)證,認(rèn)證就是確定誰(shuí)在調(diào)用WebService,并且證實(shí)調(dià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地址可配置)。2.如果調(diào)用者的權(quán)限各不相同,那么必須對(duì)WebService接口的調(diào)用進(jìn)行鑒權(quán),鑒權(quán)就是判斷調(diào)用者是否有權(quán)限調(diào)用該WebService接口。方案:可以通過(guò)Axis的handler對(duì)調(diào)用進(jìn)行鑒權(quán)。3.通過(guò)WebService接口傳遞敏感數(shù)據(jù)時(shí),必須保障其機(jī)密性。方案:采用HTTPS安全協(xié)議。使用axis2開發(fā)WebService,使用rampart-1.6.1.mar安全組件,并且該組件需要依賴wss4j等組件。4.通過(guò)WebService接口傳遞重要的交易數(shù)據(jù)時(shí),必須保障其完整性和不可抵賴性,重要的交易數(shù)據(jù),如轉(zhuǎn)賬時(shí)涉及的“轉(zhuǎn)入賬號(hào)”、“轉(zhuǎn)出賬號(hào)”、“金額”等。5.如果WebService只對(duì)特定的IP開放,那么必須對(duì)調(diào)用WebService接口的客戶端IP進(jìn)行鑒權(quán),只有在IP地址白名單中的客戶端才允許調(diào)用,IP地址白名單可配置。6.對(duì)WebService接口調(diào)用進(jìn)行日志記錄,日志內(nèi)容包括但不限于如下內(nèi)容:調(diào)用時(shí)間、操作類型、調(diào)用接口名稱、詳細(xì)的接口參數(shù)、客戶端IP、客戶端機(jī)器名、調(diào)用者的用戶標(biāo)識(shí)、受影響的個(gè)體(數(shù)據(jù)、資源)、成功或失敗標(biāo)識(shí)。7.必須對(duì)WebService提交的參數(shù)進(jìn)行輸入校驗(yàn)。RESTfulWebServiceRESTfulWebService(也稱為RESTfulWebAPI)是一個(gè)使用HTTP并遵循REST原則的Web服務(wù)。1.對(duì)RESTfulWebService的調(diào)用必須進(jìn)行認(rèn)證,認(rèn)證就是確定誰(shuí)在調(diào)用RESTfulWebService,并且證實(shí)調(dià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地址可配置)。2.調(diào)用者的權(quán)限各不相同,那么必須對(duì)RESTfulWebService的調(diào)用進(jìn)行鑒權(quán),權(quán)就是判斷調(diào)用者是否有權(quán)限調(diào)用該RESTfulWebService。3.通過(guò)RESTfulWebService傳遞敏感數(shù)據(jù)時(shí),必須保障其機(jī)密性,采用HTTPS安全協(xié)議。4.如果RESTfulWebService只對(duì)特定的IP開放,那么必須對(duì)調(diào)用RESTfulWebService的客戶端IP進(jìn)行鑒權(quán),只有在IP地址白名單中的客戶端才允許調(diào)用,IP地址白名單可配置。5.對(duì)RESTfulWebService調(diào)用進(jìn)行日志記錄,日志內(nèi)容包括但不限于如下內(nèi)容:調(diào)用時(shí)間、操作類型、調(diào)用接口名稱、詳細(xì)的接口參數(shù)、客戶端IP、客戶端機(jī)器名、調(diào)用者的用戶標(biāo)識(shí)、受影響的個(gè)體(數(shù)據(jù)、資源)、成功或失敗標(biāo)識(shí)。6.必須對(duì)RESTfulWebService提交的參數(shù)進(jìn)行輸入校驗(yàn)。應(yīng)用安全關(guān)注點(diǎn)圖1典型的Web安全技術(shù)框架圖1顯示了典型的Web應(yīng)用安全的技術(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)致的潛在問題。針對(duì)這些潛在的問題,本規(guī)范中有相應(yīng)的解決措施。表1Web應(yīng)用程序缺陷和由于不良設(shè)計(jì)可能導(dǎo)致的問題缺陷類別由于不良設(shè)計(jì)可能導(dǎo)致的問題身份驗(yàn)證身份偽造、口令破解、權(quán)限提升和未授權(quán)訪問。會(huì)話管理通過(guò)捕獲導(dǎo)致會(huì)話劫持和會(huì)話偽造。權(quán)限管理訪問機(jī)密或受限數(shù)據(jù)、篡改和執(zhí)行未授權(quán)操作。配置管理未授權(quán)訪問管理界面、更新配置數(shù)據(jù)、訪問用戶帳戶和帳戶配置文件。敏感數(shù)據(jù)機(jī)密信息泄漏和數(shù)據(jù)篡改。加密技術(shù)未授權(quán)訪問機(jī)密數(shù)據(jù)或帳戶信息。安全審計(jì)未能識(shí)別入侵征兆、無(wú)法證明用戶的操作,以及在問題診斷中存在困難。輸入檢驗(yàn)通過(guò)嵌入查詢字符串、窗體字段、Cookie和HTTP標(biāo)頭中的惡意字符串所執(zhí)行的攻擊。包括命令執(zhí)行、跨站點(diǎn)腳本編寫(XSS)、SQL注入和緩沖區(qū)溢出攻擊等。參數(shù)操作路徑遍歷攻擊、命令執(zhí)行、此外還有跳過(guò)訪問控制機(jī)制、導(dǎo)致信息泄露、權(quán)限提升和拒絕服務(wù)。異常管理拒絕服務(wù)和敏感的系統(tǒng)級(jí)詳細(xì)信息泄露。應(yīng)用安全限制應(yīng)對(duì)方案外網(wǎng)隔離前置機(jī)涉及到外網(wǎng)訪問的應(yīng)用,必須將與外網(wǎng)交互的應(yīng)用部署在外網(wǎng)前置機(jī),外部用戶或系統(tǒng)只能訪問前置機(jī)服務(wù)。內(nèi)網(wǎng)應(yīng)用當(dāng)外網(wǎng)應(yīng)用需要與內(nèi)網(wǎng)業(yè)務(wù)系統(tǒng)交互時(shí),必須在內(nèi)網(wǎng)部署相關(guān)應(yīng)用,并通過(guò)內(nèi)網(wǎng)應(yīng)用與業(yè)務(wù)系統(tǒng)交互。數(shù)據(jù)庫(kù)外網(wǎng)不允許部署數(shù)據(jù)庫(kù),所有的數(shù)據(jù)庫(kù)都部署在內(nèi)網(wǎng),外網(wǎng)應(yīng)用通過(guò)強(qiáng)隔離裝置使用JDBC訪問部署在內(nèi)網(wǎng)的數(shù)據(jù)庫(kù)。外網(wǎng)應(yīng)用不允許從外網(wǎng)直接連接內(nèi)網(wǎng)關(guān)鍵業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫(kù),如:禁止對(duì)外網(wǎng)站直接通過(guò)JDBC連接營(yíng)銷系統(tǒng)生產(chǎn)庫(kù)。外網(wǎng)文件操作外網(wǎng)不部署FTP等服務(wù),當(dāng)外網(wǎng)應(yīng)用需要文件系統(tǒng)支持時(shí),通過(guò)WebDAV來(lái)替代FTP。并且當(dāng)用戶操作需要訪問文件時(shí),文件訪問操作應(yīng)通過(guò)應(yīng)用系統(tǒng)進(jìn)行文件操作的中轉(zhuǎn),不要讓客戶端通過(guò)文件訪問協(xié)議直接連接文件系統(tǒng)。WebDAV(Web-basedDistributedAuthoringandVersioning)一種基于HTTP1.1協(xié)議的通信協(xié)議。它擴(kuò)展了HTTP1.1,在GET、POST、HEAD等幾個(gè)HTTP標(biāo)準(zhǔn)方法以外添加了一些新的方法,使HYPERLINK應(yīng)用程序可直接對(duì)WebServer上的文件讀寫,并支持寫文件鎖定(Locking)及解鎖(Unlock),還可以支持文件的HYPERLINK版本控制。正向和反向隔離裝置(國(guó)網(wǎng)系統(tǒng))正向和反向隔離裝置用于調(diào)度控制區(qū)(I/II區(qū))與管理信息區(qū)(III區(qū))數(shù)據(jù)交互的時(shí)候要用的設(shè)備。正向隔離裝置用于安全區(qū)I/II到安全區(qū)III的單向數(shù)據(jù)傳遞。反向隔離裝置用于安全區(qū)III到安全區(qū)I/II的單向數(shù)據(jù)傳遞。正向隔離裝置針對(duì)I/II區(qū)到III區(qū)通信內(nèi)容規(guī)定,南瑞SysKeeper-2000網(wǎng)絡(luò)安全隔離設(shè)備提供了豐富的通信工具軟件和API函數(shù)接口,方便用戶進(jìn)行二次系統(tǒng)隔離改造。反向隔離裝置根據(jù)全國(guó)電力二次安全防護(hù)的要求,需要將純文本文件中單字符的ASCII碼(非控制字符)轉(zhuǎn)換為對(duì)應(yīng)的雙字節(jié)碼,并能正常顯示。南瑞SysKeeper-2000反向隔離裝置提供了專用發(fā)送軟件在發(fā)送文本文件數(shù)據(jù)時(shí),自動(dòng)將半角字符轉(zhuǎn)換為全角字符。SysKeeper-2000反向隔離裝置對(duì)收到的數(shù)據(jù)進(jìn)行純文本的識(shí)別,如果數(shù)據(jù)包中數(shù)據(jù)為合法的純文本,反向隔離裝置都會(huì)按照編碼范圍正確的識(shí)別,保證進(jìn)入內(nèi)網(wǎng)的數(shù)據(jù)為純文本數(shù)據(jù)。應(yīng)用安全開發(fā)規(guī)范Java及Web安全編程規(guī)范不信任未知JAVA編程時(shí)同樣需要遵守任何輸入都是不可信的原則。所有的輸入都是不安全的,在使用前都應(yīng)進(jìn)行檢查、驗(yàn)證或者過(guò)濾。這里的輸入不僅僅指正常情況下的用戶輸入,還包括從文件獲取的內(nèi)容、從協(xié)議的數(shù)據(jù)包中獲取的內(nèi)容,從環(huán)境變量、注冊(cè)表等獲取的輸入。數(shù)據(jù)層開發(fā)預(yù)編譯語(yǔ)句數(shù)據(jù)層最大的安全風(fēng)險(xiǎn)是SQL注入,SQL注入指的是利用現(xiàn)有應(yīng)用程序,將(惡意)的SQL命令注入到后臺(tái)數(shù)據(jù)庫(kù)引擎執(zhí)行的攻擊方法。沒有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行驗(yàn)證是Sql注入攻擊得逞的主要原因。用戶可以提交一段數(shù)據(jù)庫(kù)查詢代碼,根據(jù)程序返回的結(jié)果,獲得某些他想得知的數(shù)據(jù)。為防御SQL注入攻擊,必須采用預(yù)編譯的方式執(zhí)行SQL語(yǔ)句或存儲(chǔ)過(guò)程。正確:StringquerySql=“selectusernamefromuserwhereid=?”錯(cuò)誤:Stringid=“abc”StringquerySql=“selectusernamefromuserwhereid=‘”+id+“’”一段可能產(chǎn)生SQL注入的代碼如下:Stringuser=request.getParameter("username");Stringpass=request.getParameter("password");Stringquery="SELECTidFROMusersWHEREusername="+user+"ANDpassword="+pass;Statementstmt=con.createStatement(query);ResultSetrs=con.executeQuery(query);if(rs.next()){//登錄成功intid=rs.getInt(1);…}else{//登錄失敗...}正確的做法如下:Stringuser=request.getParameter("username");Stringpass=request.getParameter("password");Stringquery="SELECTidFROMusersWHEREusername=?ANDpassword=?";PreparedStatementstmt=con.prepareStatement(query);stmt.setString(1,user);stmt.setString(2,pass);ResultSetrs=stmt.executeQuery();if(rs.next()){//登錄成功intid=rs.getInt(1);...}else{//登錄失敗...}如果沒有使用PreparedStatement類就一定要對(duì)輸入做特殊字符過(guò)濾,過(guò)濾的字符至少包括:’(單引號(hào));(分號(hào))--(兩個(gè)減號(hào))。數(shù)據(jù)驗(yàn)證在執(zhí)行SQL或存儲(chǔ)過(guò)程之前,必須確保傳入的參數(shù)變量都已經(jīng)過(guò)驗(yàn)證符合規(guī)則或權(quán)限約束。會(huì)話管理會(huì)話創(chuàng)建在用戶認(rèn)證成功后,應(yīng)先將之前的用戶會(huì)話銷毀,然后重新為用戶生成新的會(huì)話,保證認(rèn)證成功前后,用戶會(huì)話ID不一樣,并且保證不會(huì)將數(shù)據(jù)存放到未認(rèn)證通過(guò)的會(huì)話中。會(huì)話創(chuàng)建過(guò)程應(yīng)嚴(yán)格遵守以下的步驟:接收提交的用戶名和密碼驗(yàn)證通過(guò)調(diào)用session.invalidate()方法注銷當(dāng)前會(huì)話調(diào)用request.getSession(true)重新生成一個(gè)新的會(huì)話將用戶名等會(huì)話信息放入新生成的session對(duì)象中存放會(huì)話數(shù)據(jù)存儲(chǔ)不要將除了標(biāo)識(shí)當(dāng)前用戶身份之外的其它數(shù)據(jù)存放到用戶的Session中。會(huì)話注銷要提供用戶注銷功能,并且應(yīng)保證以下的代碼在注銷過(guò)程中被調(diào)用:session.invalidate()Cookie臨時(shí)Cookie臨時(shí)Cookie指的是沒有指定Expire時(shí)間,當(dāng)瀏覽器關(guān)閉后,Cookie就失效。如果要使用Cookie,因優(yōu)先選擇使用臨時(shí)Cookie,只把Cookie保存在瀏覽器的內(nèi)存中。response.setHeader(“Set-Cookie”,”name=value;”);本地Cookie本地Cookie指的是在生成Cookie時(shí),設(shè)置了Expire時(shí)間,只有當(dāng)Expire時(shí)間到了Cookie才會(huì)失效,這種Cookie會(huì)被存儲(chǔ)到客戶端本地,由于存儲(chǔ)了用戶的信息,因此這種類型的Cookie有較高的風(fēng)險(xiǎn),不要將重要的數(shù)據(jù)存儲(chǔ)在本地Cookie中。response.setHeader(“Set-Cookie”,”name=value;expire=Thu,01-Jan-201400:00:01GMT;”);Cookie訪問如果希望禁止在客戶端通過(guò)Javascript和Applet等技術(shù)訪問和操作Cookie中的數(shù)據(jù),可以在生成Cookie時(shí),在其中加入HttpOnly的屬性。response.setHeader(“Set-Cookie”,”name=value;HTTPOnly”);Cookie傳輸如果在Cookie中存儲(chǔ)了關(guān)鍵信息,希望Cookie僅當(dāng)在Https協(xié)議下的請(qǐng)求中被傳輸?shù)椒?wù)端,可以在生成Cookie時(shí),在其中加入secure的屬性。response.setHeader(“Set-Cookie”,”name=value;secure”);輸入驗(yàn)證數(shù)據(jù)格式驗(yàn)證驗(yàn)證提交的數(shù)據(jù)是否符合業(yè)務(wù)規(guī)則及格式約束,如:數(shù)據(jù)格式、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)類型。Token驗(yàn)證對(duì)涉及到數(shù)據(jù)提交操作的請(qǐng)求,必須采用POST方式提交form表單數(shù)據(jù),并在提交的表單中附加Token,通過(guò)在服務(wù)端驗(yàn)證Token的方式驗(yàn)證請(qǐng)求的合法性,避免由于URL猜測(cè)引擎的CSRF漏洞攻擊。輸入文件名的驗(yàn)證如果需要從調(diào)用方接收輸入文件名,要確保文件名具有嚴(yán)格的格式,以便可以確定它是否有效。一段有漏洞的程序:String=request.getParameter("");Stringcontent=request.getParameter("content");fw=new(newFile(“/home/y/share/templates/”+));fw.write(content);應(yīng)該對(duì)文件名做嚴(yán)格的檢查,比如使用正則表達(dá)式,限定文件名只能包括字母和數(shù)字。輸出處理使用Struts標(biāo)簽庫(kù)輸出在可能的情況下頁(yè)面上的變量應(yīng)都采用Struts標(biāo)簽輸出,Struts標(biāo)簽本身具有特殊字符編碼的功能。bean:write如果通過(guò)bean:write輸出變量,除特殊情況下確實(shí)需要輸出HTML編碼,否則都應(yīng)該使用filter屬性值為true。缺省情況下,該值為true。變量輸出前編碼如果未采用標(biāo)簽輸出變量,而是采用直接代碼的方式,如request.getParameter(“param”)、request.getAttribute(“key”)或服務(wù)端傳來(lái)的<%=var%>等方式輸出變量時(shí),必須在變量輸出之前,對(duì)變量進(jìn)行編碼轉(zhuǎn)換。在HTML標(biāo)簽及屬性中輸出在HTML標(biāo)簽及屬性中輸出變量時(shí),必須對(duì)變量進(jìn)行符合OWASP標(biāo)準(zhǔn)的HtmlEncode編碼操作<div>endoceForHTML($var)</div><ahref=#>endoceForHTML($var)</a><divname=”endoceForHTML($var)”></div>在HTML事件中輸出在HTML事件中輸出變量時(shí),必須對(duì)變量進(jìn)行符合OWASP標(biāo)準(zhǔn)的JavascriptEncode編碼操作。<ahref=#onclick=”f(‘encodeForJavascript($var)’)”>link</a>在<script>標(biāo)簽中輸出在script標(biāo)簽中輸出時(shí),首先應(yīng)該確保輸出的變量處于引號(hào)中,并且通過(guò)符合OWASP標(biāo)準(zhǔn)的JavascriptEncode編碼操作對(duì)變量進(jìn)行編碼。<script>vartemp=”encodeForJavascript($var)”;</script>在CSS中輸出CSS代碼中的XSS攻擊形式也有很多種,如:style、styleattribute等都可能引起XSS攻擊。應(yīng)盡可能避免在<style>標(biāo)簽內(nèi)部、html中的style屬性中、css文件中輸出變量。如果確實(shí)有需要輸出變量的情況,應(yīng)在輸出前對(duì)編碼進(jìn)行符合OWASP標(biāo)準(zhǔn)的cssEncode操作。<style>li{list-style-image:url(“javascript:alert(‘encodeForCSS($var)’)”);}</style>在地址中輸出對(duì)URL中的路徑或查詢參數(shù)中輸出變量,應(yīng)該對(duì)變量使用符合OWASP標(biāo)準(zhǔn)的URLEncode編碼操作<ahref=”/root/path?param=encodeForURL($var)”>link</a>富文本輸出富文本的數(shù)據(jù)類型比較特殊,富文本屬于一段比較完整的HTML代碼,在輸出時(shí)和使用時(shí)也不會(huì)被拼接到某個(gè)特殊的位置。因此如果當(dāng)前請(qǐng)求中存在包含HTML的富文本內(nèi)容,不能直接對(duì)特殊字符進(jìn)行編碼或轉(zhuǎn)義,應(yīng)對(duì)富文本內(nèi)容進(jìn)行過(guò)濾,保證輸出到客戶端的的富文本中事件代碼、<iframe>、<script>、<base>、<from>等危險(xiǎn)的HTML標(biāo)簽被嚴(yán)格禁止,僅保留安全的標(biāo)簽存在。encodeForRichHtml($var)敏感信息處理數(shù)據(jù)加密存儲(chǔ)將不允許明文存儲(chǔ)的數(shù)據(jù)加密后在存儲(chǔ)到數(shù)據(jù)庫(kù)或文件中,加密算法不能采用自己實(shí)現(xiàn)的算法,應(yīng)采用MD5、SHA、DES等經(jīng)過(guò)驗(yàn)證的加密算法進(jìn)行加密。如:用戶口令,必須使用不可逆的加密算法加密后在存儲(chǔ)在數(shù)據(jù)庫(kù)中。數(shù)據(jù)傳輸加密將涉及到以下情況的請(qǐng)求通過(guò)Https協(xié)議發(fā)送涉及到用戶登錄驗(yàn)證的請(qǐng)求涉及到會(huì)話生成的請(qǐng)求涉及到用戶密碼傳輸及修改的請(qǐng)求涉及到支付操作的請(qǐng)求涉及到重要及敏感數(shù)據(jù)的請(qǐng)求禁止緩存服務(wù)端和客戶端都禁止緩存敏感數(shù)據(jù)。在服務(wù)端,當(dāng)敏感數(shù)據(jù)使用完后,應(yīng)將數(shù)據(jù)從內(nèi)存中刪除。在客戶端,包含敏感數(shù)據(jù)的HTTPS請(qǐng)求,要設(shè)置以下的頭信息,禁止瀏覽器緩存頁(yè)面數(shù)據(jù),HTTP頭信息代碼如下:Cache-Control:no-cache,no-store;異常信息處理不允許將異常信息拋給客戶端顯示,否則可能造成服務(wù)端信息泄露。如果系統(tǒng)功能出現(xiàn)異常,應(yīng)跳轉(zhuǎn)到專門的異常頁(yè)面,并將友好的提示信息提示給用戶,而不是將異常信息顯示給用戶,并且返回給客戶端HTTP響應(yīng)結(jié)果為500。特殊頁(yè)面跳轉(zhuǎn)404-路徑不存在當(dāng)用戶訪問了一個(gè)系統(tǒng)中不存在的路徑時(shí),應(yīng)將請(qǐng)求跳轉(zhuǎn)到指定的404處理頁(yè)面,提示用戶訪問的路徑不存在,并返回給瀏覽器HTTP404編碼。403-禁止訪問當(dāng)用戶訪問了一個(gè)無(wú)訪問權(quán)限的路徑時(shí),應(yīng)將請(qǐng)求跳轉(zhuǎn)到指定的403處理頁(yè)面,提示用戶無(wú)權(quán)訪問,并返回給瀏覽器HTTP403編碼。500-內(nèi)部錯(cuò)誤當(dāng)用戶操作引起系統(tǒng)服務(wù)端應(yīng)用異常時(shí),應(yīng)將請(qǐng)求跳轉(zhuǎn)到指定的500處理頁(yè)面,提示用戶當(dāng)前系統(tǒng)出現(xiàn)異常,并返回給瀏覽器HTTP500編碼。文件操作臨時(shí)文件系統(tǒng)運(yùn)行過(guò)程中生成的臨時(shí)文件必須存放在應(yīng)用部署根目錄之外。并且在使用完后要立即刪除,臨時(shí)文件不允許重復(fù)使用。臨時(shí)文件名必須采用足夠長(zhǎng)度的隨機(jī)算法生成。文件上傳文件路徑控制對(duì)上傳的文件需要在服務(wù)端將路徑轉(zhuǎn)為系統(tǒng)絕對(duì)路徑,然后對(duì)比當(dāng)前路徑是否屬于允許存儲(chǔ)的路徑之下。文件類型控制禁止上傳可執(zhí)行文件,如:jsp,asp,aspx,exe,bat等類型的文件,通過(guò)白名單的方式僅僅允許上次指定類型的文件。文件大小控制必須按照要求限制上傳到服務(wù)器上文件的大小目錄文件數(shù)量不要將大量的文件上傳并存儲(chǔ)在統(tǒng)一個(gè)目錄下,應(yīng)該按照一定的規(guī)則,將文件分散存放到不同的目錄。文件名保存在服務(wù)器上的文件名必須經(jīng)過(guò)修改,文件上傳到服務(wù)器上后,采用非常隨機(jī)的算法(如:GUID)重新生成文件名。文件下載下載驗(yàn)證每個(gè)文件下載之前都應(yīng)通過(guò)權(quán)限驗(yàn)證,否則可能引起通過(guò)修改URL參數(shù)即可下載任意文件的漏洞。文件路徑控制所有下載的文件,都必須驗(yàn)證待下載文件路徑是否出在允許下載文件的路徑范圍內(nèi)。資源釋放所有涉及到IO操作的資源都應(yīng)該在finally塊中釋放,保證資源在任何環(huán)境下都會(huì)被釋放。內(nèi)存控制大對(duì)象如果要加載大對(duì)象到內(nèi)存中,應(yīng)盡可能減少大對(duì)象在內(nèi)存中的存活時(shí)間,使用完后立即釋放,并將對(duì)象應(yīng)用設(shè)置為NULL,對(duì)于大對(duì)象的內(nèi)存回收不應(yīng)太過(guò)依賴內(nèi)存垃圾回收機(jī)制。數(shù)據(jù)庫(kù)操作要限制數(shù)據(jù)庫(kù)操作的每個(gè)請(qǐng)求返回的結(jié)果集最大值,如果需要讀取的結(jié)果集記錄數(shù)過(guò)大,應(yīng)采用多次分頁(yè)讀取的方式,分批從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)。外部程序調(diào)用漏洞應(yīng)該避免在程序中調(diào)用系統(tǒng)命令,如果必須使用系統(tǒng)命令,應(yīng)對(duì)輸入?yún)?shù)做嚴(yán)格的過(guò)濾,比如一段存在漏洞的程序如下:Stringip=request.getParameter(“ip”);Processp=Runtime.getRuntime().exec(“/bin/shnslookup”+ip);應(yīng)使用正則表達(dá)式對(duì)輸入的參數(shù)(IP)做嚴(yán)格過(guò)濾,否則用戶可以提交如下格式的IP數(shù)據(jù):;[自己的命令]來(lái)執(zhí)行自己的命令。整數(shù)溢出整數(shù)的范圍是[-2^31,+2^31-1],又有以下等式成立:-2^31==2^31+1以上范圍和等式在Java中同樣成立,所以整數(shù)溢出同樣在存在于Java,由于整數(shù)的溢出導(dǎo)致流程的改變。一
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑工地施工人員職業(yè)健康監(jiān)護(hù)合同范本
- 2025年度建筑工程造價(jià)咨詢承攬合同范本
- 2025年度兼職翻譯人才合作協(xié)議范本
- 2025年度房地產(chǎn)項(xiàng)目配套設(shè)施建設(shè)合作協(xié)議
- 2025年度季節(jié)性用工勞動(dòng)爭(zhēng)議調(diào)解合同范本
- 2025年度建筑垃圾資源化利用處理合同范本-@-5
- 2025年度建筑攪拌站運(yùn)營(yíng)管理服務(wù)合同書
- 2025年中國(guó)食品塑料包裝市場(chǎng)競(jìng)爭(zhēng)格局及投資前景展望報(bào)告
- 2024年烘焙食品原料市場(chǎng)調(diào)研報(bào)告
- 2025年度酒類產(chǎn)品售后服務(wù)合同范本
- QC課題提高金剛砂地面施工一次合格率
- 呼吸科護(hù)理管理制度
- TCI 331-2024 工業(yè)污染源產(chǎn)排污核算系數(shù)制定通則
- 浙江省(面試)公務(wù)員考試試題及答案指導(dǎo)(2025年)
- 設(shè)備拆裝施工方案
- 注冊(cè)安全工程師《安全生產(chǎn)管理知識(shí)》科目知識(shí)要點(diǎn)
- 《新時(shí)代公民道德建設(shè)實(shí)施綱要》、《新時(shí)代愛國(guó)主義教育實(shí)施綱要》知識(shí)競(jìng)賽試題庫(kù)55題(含答案)
- 小學(xué)百科知識(shí)競(jìng)賽題庫(kù)200道及答案(完整版)
- JJ∕G(交通) 201-2024公路橋梁支座壓剪試驗(yàn)機(jī)
- 2019-2020學(xué)年七年級(jí)(上)期末數(shù)學(xué)試卷2附解析
- 電話接聽技巧與服務(wù)質(zhì)量提升方案三篇
評(píng)論
0/150
提交評(píng)論