WEB安全編程技術(shù)規(guī)范_第1頁(yè)
WEB安全編程技術(shù)規(guī)范_第2頁(yè)
WEB安全編程技術(shù)規(guī)范_第3頁(yè)
WEB安全編程技術(shù)規(guī)范_第4頁(yè)
WEB安全編程技術(shù)規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩20頁(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)介

1、1. 范圍本規(guī)范從WEB應(yīng)用開發(fā)安全管理要求出發(fā),給出了WEB編碼安全的具體要求。本規(guī)范明確定義了JAVA應(yīng)用開發(fā)中和WEB編碼安全相關(guān)的技術(shù)細(xì)節(jié)。與JAVA編碼安全相關(guān)的內(nèi)容包括:跨站腳本攻擊及解決方法、SQL注入及解決方法、惡意文件執(zhí)行及解決方法、不安全的直接對(duì)象引用及解決方法、跨站請(qǐng)求偽造及解決方法、信息泄露和錯(cuò)誤處理不當(dāng)及解決方法、殘缺的認(rèn)證和會(huì)話管理及解決方法、不安全的加密存儲(chǔ)及解決方法、不安全的通信及解決方法、限制URL訪問(wèn)實(shí)效解決方法等。2. 1.規(guī)范概述Web應(yīng)用程序?yàn)榧軜?gòu)設(shè)計(jì)人員、開發(fā)人員、測(cè)試人員和運(yùn)維運(yùn)營(yíng)人員提出一系列復(fù)雜的安全問(wèn)題,最安全、最有能力抵御攻擊的Web應(yīng)用程

2、序是那些應(yīng)用安全思想構(gòu)建的應(yīng)用程序。在設(shè)計(jì)初始階段,應(yīng)該使用可靠的體系結(jié)構(gòu)和設(shè)計(jì)方法,同時(shí)要結(jié)合考慮程序部署以及企業(yè)的安全策略。如果不能做到這一點(diǎn),將導(dǎo)致在現(xiàn)有基礎(chǔ)結(jié)構(gòu)上部署應(yīng)用程序時(shí),要不可避免地危及安全性。本規(guī)范提供一系列安全的體系結(jié)構(gòu)和設(shè)計(jì)指南,并按照常見(jiàn)的應(yīng)用程序漏洞類別進(jìn)行組織。這些指南是Web應(yīng)用程序安全的重要方面,并且是經(jīng)常發(fā)生錯(cuò)誤的領(lǐng)域。2.實(shí)現(xiàn)目標(biāo)使用本規(guī)范可以實(shí)現(xiàn):1. 確定安全Web應(yīng)用程序的重要體系結(jié)構(gòu)和設(shè)計(jì)問(wèn)題。2. 設(shè)計(jì)時(shí)考慮重要部署問(wèn)題。3. 制定能增強(qiáng)Web應(yīng)用程序輸入驗(yàn)證的策略。4. 設(shè)計(jì)安全的身份驗(yàn)證和會(huì)話管理機(jī)制。5. 選擇適當(dāng)?shù)氖跈?quán)模型。6. 實(shí)現(xiàn)有效的

3、帳戶管理方法,并保護(hù)用戶會(huì)話。7. 對(duì)隱私認(rèn)可并防止篡改,和對(duì)身份驗(yàn)證信息進(jìn)行加密。8. 防止參數(shù)操作。9. 安全漏洞checklist。10. 設(shè)計(jì)審核和記錄策略。3.安全編碼原則1. 程序只實(shí)現(xiàn)你指定的功能。2. 永不要信任用戶輸入,對(duì)用戶輸入數(shù)據(jù)做有效性檢查。3. 必須考慮意外情況并進(jìn)行處理。4. 不要試圖在發(fā)現(xiàn)錯(cuò)誤之后繼續(xù)執(zhí)行。5. 盡可能使用安全函數(shù)進(jìn)行編程。6. 小心、認(rèn)真、細(xì)致地編程。4.安全背景知識(shí)本規(guī)范主要提供設(shè)計(jì)應(yīng)用程序時(shí)應(yīng)該遵循的一些指南和原則。為充分理解本規(guī)范內(nèi)容,請(qǐng):了解應(yīng)用程序?qū)?huì)受到的威脅,以確保通過(guò)程序設(shè)計(jì)解決這些問(wèn)題。了解需要考慮的威脅,在程序設(shè)計(jì)階段應(yīng)該考慮

4、到這些威脅。在應(yīng)用程序易受攻擊的重要環(huán)節(jié)應(yīng)用系統(tǒng)的方法。將重點(diǎn)放在程序部署、輸入驗(yàn)證、身份驗(yàn)證和授權(quán)、加密及數(shù)據(jù)敏感度、配置、會(huì)話、異常管理以及適當(dāng)?shù)膶徍撕陀涗洸呗陨希源_保應(yīng)用程序具有健壯性。5.JAVA安全編程OWASP TOP10 AND ESAPI5.1 OWASP TOP 10 與ESAPIOWASP(開放Web應(yīng)用安全項(xiàng)目-OpenWebApplicationSecurityProject)是一個(gè)開放社群、非營(yíng)利性組織,目前全球有82個(gè)分會(huì)近萬(wàn)名會(huì)員,其主要目是研議協(xié)助解決Web軟體安全之準(zhǔn)則、工具與技術(shù),長(zhǎng)期致力于協(xié)助政府或企業(yè)并改善網(wǎng)頁(yè)應(yīng)用程式與網(wǎng)頁(yè)服務(wù)的安全性。OWASP T

5、OP 10是10個(gè)最關(guān)鍵的Web應(yīng)用安全問(wèn)題清單。這份名單是每隔數(shù)年更新(最近2013年)。Top 10項(xiàng)目的目標(biāo)是通過(guò)找出企業(yè)組織所面臨的最嚴(yán)重的風(fēng)險(xiǎn)來(lái)􏰀高人們對(duì)應(yīng)用程序安全的關(guān)注度。Top 10項(xiàng)目被眾多標(biāo)準(zhǔn)、書籍、工具和相關(guān)組織引用,包括 MITRE、PCI DSS、DISA、 FTC等等。此版本的 OWASP Top 10標(biāo)記了該項(xiàng)目這十年來(lái)對(duì)于應(yīng)用程序安全風(fēng)險(xiǎn)重要性認(rèn)知的推廣。OWASP Top 10最初于2003 年發(fā)布,并于2004年和2007年相繼做了少許的修改更新。2010年版做了修改以對(duì)風(fēng)險(xiǎn)進(jìn)行排序,而不僅僅僅限于流行程度。本次發(fā)布的2013年版也沿用了該

6、方法。名單上都是那些通常很簡(jiǎn)單的,危險(xiǎn)的安全問(wèn)題。這里是一個(gè)以在OWASP十大項(xiàng)目的鏈接。/index.php/Category:OWASP_Top_Ten_Project其實(shí)簡(jiǎn)單一點(diǎn)來(lái)說(shuō),ESAPI就是為編寫出更加安全的代碼設(shè)計(jì)出來(lái)的一些API,方便使用者調(diào)用,從而方便的編寫安全的代碼。它本身是開源的,同時(shí)提供JAVA版本和.NET版本。代碼下載地址:下圖顯示提供的API與OWASP列出的10個(gè)安全問(wèn)題的蓋關(guān)系:下圖顯示結(jié)合ESAPI設(shè)計(jì)你的程序:下圖簡(jiǎn)單呈現(xiàn)ESAPI如何運(yùn)作:5.2 跨站腳本(XSS)5.2.1定義當(dāng)應(yīng)用程序收到含有不可信的數(shù)據(jù),在沒(méi)

7、有進(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)站。5.2.2危害攻擊者能在受害者瀏覽器中執(zhí)行腳本以劫持用戶會(huì)話、迫害網(wǎng)站、插入惡意內(nèi)容、重定向用戶、使用惡意軟件劫持用戶瀏覽器等等。5.2.3種類已知有三種著名跨站漏洞:1)存儲(chǔ)式;2)反射式;3)基于DOM。反射式跨站腳本通過(guò)測(cè)試或代碼分析很容易找到。5.2.4解決方法.驗(yàn)證輸入驗(yàn)證輸入很簡(jiǎn)單-檢查每個(gè)輸入的有效性。這可能意味著很多東西,但在典型的和簡(jiǎn)單的情況下,這意味著檢查輸入類型和數(shù)

8、據(jù)的長(zhǎng)度。例如,如果你是從一個(gè)文本框接受一個(gè)準(zhǔn)的郵政編碼,你會(huì)知道,唯一有效的類型是一個(gè)數(shù)字(0-9),而長(zhǎng)度應(yīng)該是6,不能多也不能少。并非所有的案件都如此簡(jiǎn)單,但很多是相似的。下圖顯示驗(yàn)證輸入的架構(gòu)。這里的關(guān)鍵是,一切都進(jìn)行驗(yàn)證,所有的輸入,這并不來(lái)自于應(yīng)用程序(包括用戶輸入,請(qǐng)求頭,Cookie,數(shù)據(jù)庫(kù)數(shù)據(jù).)。u 實(shí)例getValidInput(java.lang.Stringcontext,java.lang.Stringinput,java.lang.Stringtype,intmaxLength,boolean allowNull,ValidationErrorListerrors

9、)isValidInput(java.lang.Stringcontext,java.lang.Stringinput,java.lang.Stringtype,intmaxLength,boolean allowNull)StringvalidatedFirstName=ESAPI.validator().getValidInput("FirstName",myForm.getFirstName(),"FirstNameRegex",255,false,errorList);boolean isValidFirstName=ESAPI.validato

10、r().isValidInput("FirstName",myForm.getFirstName(),"FirstNameRegex",255,false);.編碼輸出對(duì)驗(yàn)證輸入的另一面就是編碼輸出。編碼輸出,是用來(lái)確保字符被視為數(shù)據(jù),而不是作為HTML元字符被瀏覽器解析。這些技術(shù)定義一些特殊的"轉(zhuǎn)義"字符。沒(méi)有正確轉(zhuǎn)義的數(shù)據(jù)它仍然會(huì)在瀏覽器中正確解析。編碼輸出只是讓瀏覽器知道數(shù)據(jù)是不是要被解析,達(dá)到攻擊無(wú)法實(shí)現(xiàn)的目的。需要編碼的部分:1、HTML實(shí)體2、HTML屬性3、Javascript4、CSS5、URL下圖像顯示

11、編碼輸出的架構(gòu)。u 實(shí)例1HTML實(shí)體編碼/performinginputvalidationStringcleanComment=ESAPI.validator().getValidInput("comment",request.getParameter("comment"),"CommentRegex",300,false,errorList);/checktheerrorListhere./performingoutputencodingfortheHTMLcontextStringsafeOutput=ESAPI.encode

12、r().encodeForHTML(cleanComment);u 實(shí)例2URL編碼/performinginputvalidationStringcleanUserName=ESAPI.validator().getValidInput("userName",request.getParameter("userName"),"userNameRegex",50,false,errorList);/checktheerrorListhere./performingoutputencodingfortheurlcontextString

13、safeOutput="/admin/findUser.do?name="+ESAPI.encoder().encodeForURL(cleanUserName);5.3 SQL注入5.3.1定義注入攻擊漏洞,例如SQL、OS以及LDAP注入。這些攻擊發(fā)生在當(dāng)不可信的數(shù)據(jù)作為命令或者查詢語(yǔ)句的一部分,被發(fā)送給解釋器的時(shí)候。攻擊者發(fā)送的惡意數(shù)據(jù)可以欺騙解釋器,以執(zhí)行計(jì)劃外的命令或者在未被恰當(dāng)授權(quán)時(shí)訪問(wèn)數(shù)據(jù)。簡(jiǎn)單來(lái)說(shuō),注入往往是應(yīng)用程序缺少對(duì)輸入進(jìn)行安全性檢查所引起的,攻擊者把一些包含指令的數(shù)據(jù)發(fā)送給解釋器,解釋器會(huì)把收到的數(shù)據(jù)轉(zhuǎn)換成指令執(zhí)行,注入漏洞十分普遍,通常能在SQL查

14、詢、LDAP查詢、Xpath查詢、OS命令、程序參數(shù)等中出現(xiàn)。5.3.2危害注入能導(dǎo)致數(shù)據(jù)丟失或數(shù)據(jù)破壞、缺乏可審計(jì)性或是拒絕服務(wù)。注入漏洞有時(shí)甚至能導(dǎo)致完全接管主機(jī)。5.3.3種類SQL注入、XPATH注入、LDAP注入、OS命令注入等。5.3.4解決方法.SQL注入實(shí)例String sqlString="SELECT * FROM users WHERE fullname='"+form.getFullName()+"'AND password='"+form.getPassword()+"'&

15、quot;正常:username=tony,password=123456SELECT * FROM users WHERE username=tony' AND password='123456'攻擊:username=tony,password='OR'1'='1SELECT * FROM users WHERE username=tony'ANDpassword='' OR '1'='1'.參數(shù)化查詢預(yù)處理使用PreparedStatement()綁定變量下面的代

16、碼示例使用一個(gè)PreparedStatement,Java的一個(gè)參數(shù)化查詢的執(zhí)行情況,執(zhí)行相同的數(shù)據(jù)庫(kù)查詢。String custname=request.getParameter("customerName");/ThisshouldREALLYbevalidatedtoo/performinputvalidationtodetectattacksString query="SELECT account_balance FROM user_dataWHERE user_name=?"PreparedStatementpstmt=connection.p

17、repareStatement(query);pstmt.setString(1,custname);ResultSetresults=pstmt.executeQuery();.使用存儲(chǔ)過(guò)程String custname=request.getParameter("customerName");/ThisshouldREALLYbevalidatedtryCallableStatementcs=connection.prepareCall("callsp_getAccountBalance(?)");cs.setString(1,cust

18、name);ResultSetresults=cs.executeQuery();/¼resultsethandlingcatch(SQLExceptionse)/¼logginganderrorhandling.使用ESAPI/ESAPIversionofqueryCodecORACLE_CODEC=newOracleCodec();/we'reusingoracleStringquery="SELECTnameFROMusersWHEREid="+ESAPI.encoder().encodeForSQL(ORACLE_CODEC

19、,validatedUserId)+"AND date_created>='"+ESAPI.encoder().encodeForSQL(ORACLE_CODEC,validatedStartDate)+"'"myStmt=conn.createStatement(query);./executestatementandgetresults5.4惡意文件執(zhí)行5.4.1定義惡意文件執(zhí)行是一種能夠威脅任何網(wǎng)站形式的漏洞,只要攻擊者在具有引入(include)功能程式的參數(shù)中修改參數(shù)內(nèi)容,WEB服務(wù)器便會(huì)引入惡意程序內(nèi)容從而受到惡意文件執(zhí)

20、行漏洞攻擊。5.4.2危害攻擊者可利用惡意文件執(zhí)行漏洞進(jìn)行攻擊取得WEB服務(wù)器控制權(quán),進(jìn)行不法利益或獲取經(jīng)濟(jì)利益。5.4.3解決方法實(shí)例1驗(yàn)證輸入,使用ESAPI驗(yàn)證上傳文件名if(!ESAPI.validator().isValidFileName("upload",filename,allowedExtensions,false)throw new Validation UploadException("Upload only simple filenames withthefollowingextensions"+allowedExt

21、ensions,"Upload failedisValidFileName check");實(shí)例2使用ESAPI檢查上傳文件大小ServletFileUpload upload=newServletFileUpload(factory);upload.setSizeMax(maxBytes);5.5不安全的直接對(duì)象引用5.5.1定義當(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ù)。所謂"不安全的對(duì)象直接引用",

22、即Insecure direct objectreferences,意指一個(gè)已經(jīng)授權(quán)的用戶,通過(guò)更改訪問(wèn)時(shí)的一個(gè)參數(shù),從而訪問(wèn)到原本其并沒(méi)有得到授權(quán)的對(duì)象。Web應(yīng)用往往在生成Web頁(yè)面時(shí)會(huì)用它的真實(shí)名字,且并不會(huì)對(duì)所有的目對(duì)象訪問(wèn)時(shí)來(lái)檢查用戶權(quán)限,所以這就造成不安全的對(duì)象直接引用的漏洞。我們看如下的一個(gè)示例,也許這樣就更容易理解什么是不安全的對(duì)象直接引用。Ø 攻擊者發(fā)現(xiàn)他自己的參數(shù)是6065,即?acct=6065;Ø 他可以直接更改參數(shù)為6066,即?acct=6066;Ø 這樣他就可以直接看到6066用戶的賬戶信息。5.5.2危害這種漏洞能損害參數(shù)所引用的所

23、有數(shù)據(jù)。除非名字空間很稀疏,否則攻擊者很容易訪問(wèn)該類型的所有數(shù)據(jù)。5.5.3解決方法.案例1使用ESAPI的AccessReferenceMap實(shí)現(xiàn)使用非直接的對(duì)象引用MyObjectobj;/generateyourobjectCollectioncoll;/holdsobjectsfordisplayinUI/create ESAPI random access reference mapAccessReferenceMap map=newRandomAccessReferenceMap();/get indirect reference using direct refer

24、ence as seed inputString indirectReference=map.addDirectReference(obj.getId();/set indirect reference for each object-requires your app object to have this methodbj.setIndirectReference(indirectReference);/add object to display collectioncoll.add(obj);/store collection in request/session and forward

25、 to UI..案例2檢查訪問(wèn)。來(lái)自不受信源所使用的所有直接對(duì)象引用都必須包含訪問(wèn)控制檢測(cè),這樣才能確保用戶對(duì)要求的對(duì)象有訪問(wèn)權(quán)限5.6跨站請(qǐng)求偽造(CSRF)5.6.1.定義跨站請(qǐng)求偽造,也被稱成為"oneclickattack"或者sessionriding,通??s寫為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利用。盡管聽(tīng)起來(lái)像跨站腳本(XSS),但它與XSS非常不同,并且攻擊方式幾乎相左。XSS利用站點(diǎn)內(nèi)的信任用戶,而CSRF則通過(guò)偽裝來(lái)自受信任用戶的請(qǐng)求來(lái)利用受信任的網(wǎng)站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對(duì)其進(jìn)行防范的資源也相當(dāng)稀少)和難

26、以防范,所以被認(rèn)為比XSS更具危險(xiǎn)性。一個(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)求。5.6.2.危害攻擊者能讓受害用戶修改可以修改的任何數(shù)據(jù),或者是執(zhí)行允許使用的任何功能。5.6.3.解決方法第一步,新建CSRF令牌添加進(jìn)用戶每次登陸以及存儲(chǔ)在httpsession里,這種令牌至少對(duì)每個(gè)用戶會(huì)話來(lái)說(shuō)應(yīng)該是唯一的,或者是對(duì)每個(gè)請(qǐng)求是唯一的。/this code is in the DefaultU

27、ser implementation of ESAPI/*This user's CSRF token.*/Private String csrfToken=resetCSRFToken();.Public String resetCSRFToken()csrfToken=ESAPI.randomizer().getRandomString(8,DefaultEncoder.CHAR_ALPHANUMERICS);returncsrfToken;第二步,令牌同樣可以包含在URL中或作為一個(gè)URL參數(shù)記/隱藏字段。/from HTTP Utilitiles interfaceFinal

28、static String CSRF_TOKEN_NAME="ctoken"/this code is from the Default HTTP Utilities implementation in ESAPIPublic String addCSRFToken(Stringhref)User user=ESAPI.authenticator().getCurrentUser();if(user.isAnonymous()returnhref;/if there are already parameters append with&,otherwise appe

29、nd with?String token=CSRF_TOKEN_NAME+"="+user.getCSRFToken();return href.indexOf('?')!=-1?href+"&"+token:href+"?"+token;.public StringgetCSRFToken()User user=ESAPI.authenticator().getCurrentUser();if(user=null) return null;return user.getCSRFToken();第三步,在服務(wù)器

30、端檢查提交令牌與用戶會(huì)話對(duì)象令牌是否匹配。/this code is from the Defaul tHTTP Utilities implementation in ESAPIPublic void verifyCSRFToken(HttpServletRequest request)throwsIntrusionExceptionUser user=ESAPI.authenticator().getCurrentUser();/check if user authenticated with this request-noCSRFprotection requiredif(request

31、.getAttribute(user.getCSRFToken()!=null)return;String token=request.getParameter(CSRF_TOKEN_NAME);if(!user.getCSRFToken().equals(token)throw new IntrusionException("Authenticationfailed","Possibly forgeted HTTP request without proper CSRFtokendetected");第四步,在注銷和會(huì)話超時(shí),刪除用戶對(duì)象會(huì)話和會(huì)話銷毀

32、。/this code is in the DefaultUser implementation of ESAPIPublic void logout()ESAPI.httpUtilities().killCookie(ESAPI.currentResponse(),ESAPI.currentRequest(),HTTPUtilities.REMEMBER_TOKEN_COOKIE_NAME);HttpSession session=ESAPI.currentRequest().getSession(false);if(session!=null)removeSession(session);

33、session.invalidate();ESAPI.httpUtilities().killCookie(ESAPI.currentRequest(),ESAPI.currentResponse(),"JSESSIONID");loggedIn=false;(Logger.SECURITY_SUCCESS,"Logout successful");ESAPI.authenticator().setCurrentUser(User.ANONYMOUS);5.7信息泄露和錯(cuò)處理不當(dāng)5.7.1定義應(yīng)用程序常常產(chǎn)生錯(cuò)誤信息并顯示給使用者。

34、很多時(shí)候,這些錯(cuò)誤信息是非常有用的攻擊信息,因?yàn)樗鼈兘沂緦?shí)施細(xì)則或有用的開發(fā)信息利用的漏洞。5.7.2危害Ø 泄露太多的細(xì)節(jié)(如錯(cuò)誤堆棧跟蹤信息、SQL語(yǔ)句等等);Ø 登錄失敗后,通知用戶是否用戶ID或密碼出錯(cuò)登錄失敗可能是由于ID或密碼錯(cuò)誤造成的。這為一個(gè)對(duì)關(guān)鍵資產(chǎn)發(fā)動(dòng)蠻力攻擊的攻擊者提供重要信息。5.7.3解決方法.案例1通過(guò)web.xml配置文件實(shí)現(xiàn)<error-page><exception-type>java.lang.Throwable</exception-type><location>/error

35、.jsp</location></error-page>.案例2針對(duì)登錄嘗試的攻擊,可以使用相同的報(bào)錯(cuò)信息,比如都是提示"輸入的用戶名或者密碼錯(cuò)誤!"。5.8失效的身份認(rèn)證和會(huì)話管理5.8.1定義與身份認(rèn)證和會(huì)話管理相關(guān)的應(yīng)用程序功能得不到正確的實(shí)現(xiàn),導(dǎo)致攻擊者破話密碼、密鑰、會(huì)話令牌或攻擊其他的漏洞去冒充其他用戶的身份。5.8.2危害這些漏洞可能導(dǎo)致部分甚至全部帳戶遭受攻擊。一旦攻擊成功,攻擊者能執(zhí)行合法用戶的任何操作。因此特權(quán)帳戶會(huì)造成更大的破壞。5.8.3解決方法Ø 使用內(nèi)置的會(huì)話管理功能。Ø 通過(guò)認(rèn)證的問(wèn)候。

36、Ø 使用單一的入口點(diǎn)。Ø 確保在一開始登錄SSL保護(hù)的網(wǎng)頁(yè)。Ø 獲取注銷的權(quán)利。Ø 添加超時(shí)。Ø 確保你使用的是安全相關(guān)的功能。Ø 使用強(qiáng)大的認(rèn)證。Ø 不進(jìn)行默認(rèn)身份驗(yàn)證/BAD-DON'TUSEPublic boolean login(String username,Stringpassword)Boolean isAuthenticated=true;try/makecalls to backend to actually perform login against datastoreif(!authentica

37、tionSuccess)isAuthenticated=false;catch(Exceptione)/handleexcreturnisAuthenticated;5.9 敏感信息泄露5.9.1定義保護(hù)與加密敏感數(shù)據(jù)已經(jīng)成為網(wǎng)絡(luò)應(yīng)用的最重要的組成部分。但是,簡(jiǎn)單不加密的敏感數(shù)據(jù)是非常普遍的。許多Web應(yīng)用程序沒(méi)有正確保護(hù)敏感數(shù)據(jù),如信用卡、稅務(wù)ID和身份驗(yàn)證憑據(jù)。攻擊者可能會(huì)竊取或篡改這些弱保護(hù)的數(shù)據(jù)以進(jìn)行信用卡詐騙、身份竊取,或其他犯罪。敏感數(shù)據(jù)值需額外的保護(hù),比如在存放或在傳輸過(guò)程中的加密,以及在與瀏覽器交換時(shí)進(jìn)行特殊的預(yù)防措施。5.9.2危害Ø 攻擊者能夠取得或是篡改機(jī)密的或

38、是私有的信息。Ø 攻擊者通過(guò)這些秘密的竊取從而進(jìn)行進(jìn)一步的攻擊。Ø 造成企業(yè)形象破損,用戶滿意度下降,甚至?xí)蟹稍V訟等。5.9.3解決方法Ø 驗(yàn)證你的結(jié)構(gòu)。Ø 識(shí)別所有的敏感數(shù)據(jù)。Ø 識(shí)別這些數(shù)據(jù)存放的所有位置。Ø 確保所應(yīng)用的威脅模型能夠應(yīng)付這些攻擊。Ø 使用加密手段來(lái)應(yīng)對(duì)威脅。Ø 使用一定的機(jī)制來(lái)進(jìn)行保護(hù)。Ø 文件加密。Ø 數(shù)據(jù)庫(kù)加密。Ø 數(shù)據(jù)元素加密。Ø 正確的使用這些機(jī)制。Ø 使用準(zhǔn)的強(qiáng)算法。Ø 合理的生成,分發(fā)和保護(hù)密鑰。Ø 準(zhǔn)備密鑰

39、的變更。Ø 驗(yàn)證實(shí)現(xiàn)方法。Ø 確保使用準(zhǔn)的強(qiáng)算法。Ø 確保所有的證書、密鑰和密碼都得到安全的存放。Ø 有一個(gè)安全的密鑰分發(fā)和應(yīng)急處理的方案。5.10不安全的通信5.10.1定義對(duì)于不加密的應(yīng)用程序的網(wǎng)絡(luò)信息傳輸,需要保護(hù)敏感的通信。加密(通常SSL)的鏈路,必須用于所有身份驗(yàn)證的連接,特別是通過(guò)Internet訪問(wèn)的網(wǎng)頁(yè),以及后端的連接。否則,應(yīng)用程序?qū)⒈┞渡矸蒡?yàn)證或會(huì)話令牌。5.10.2危害Ø 攻擊者能夠取得或是篡改機(jī)密的或是私有的信息。Ø 攻擊者通過(guò)這些秘密的竊取從而進(jìn)行進(jìn)一步的攻。Ø 造成企業(yè)形象破損,用戶滿意度下降,

40、甚至?xí)蟹稍V訟等。5.10.3解決方法Ø 提供合理的保護(hù)機(jī)制。Ø 對(duì)于敏感數(shù)據(jù)的傳輸,對(duì)所有連接都要使用TLS。Ø 在傳輸前對(duì)單個(gè)數(shù)據(jù)都要進(jìn)行加密;(如XML-Encryption)Ø 在傳輸前對(duì)信息進(jìn)行名;(如XML-Signature)Ø 正確的使用這些機(jī)制。Ø 使用準(zhǔn)的強(qiáng)算法。Ø 合理管理密鑰和證書。Ø 在使用前驗(yàn)證SSL證書。5.11功能級(jí)訪問(wèn)控制缺失5.11.1定義這個(gè)漏洞事實(shí)上也是與認(rèn)證相關(guān)的,與我們前面提到的Top5不安全的直接對(duì)象引用也是類似的,不同在于這個(gè)漏洞是說(shuō)系統(tǒng)已經(jīng)對(duì)URL的訪問(wèn)做限制,但

41、這種限制卻實(shí)際并沒(méi)有生效。大多數(shù)Web應(yīng)用程序在功能在UI中可見(jiàn)驗(yàn)證功能級(jí)別的訪問(wèn)權(quán)限,但是,應(yīng)用程序需要在每個(gè)功能被訪問(wèn)時(shí)在服務(wù)器端執(zhí)行相同的訪問(wèn)控制檢查。如果請(qǐng)求沒(méi)有被驗(yàn)證,攻擊者能夠偽造請(qǐng)求以在未經(jīng)適當(dāng)授權(quán)時(shí)訪問(wèn)功能。常見(jiàn)的錯(cuò)誤是,我們?cè)谟脩粽J(rèn)證后只顯示給用戶認(rèn)證過(guò)的頁(yè)面和菜單選項(xiàng),而實(shí)際上這些僅僅是表示層的訪問(wèn)控制而不能真正生效,攻擊者能夠很容易的就偽造請(qǐng)求直接訪問(wèn)未被授權(quán)的頁(yè)面。我們舉個(gè)例子來(lái)說(shuō)明這個(gè)過(guò)程:1、攻擊者發(fā)現(xiàn)他自己的訪問(wèn)地址為/user/getAccounts;2、他修改他的目錄為/admin/getAccounts或/manager/getAccounts;3、這樣攻擊

42、者就能夠查看到更多的賬戶信息。5.11.2解決方法對(duì)每個(gè)URL,我們必須做三件事:Ø 如果這個(gè)URL不是公開的,那么必須限制能夠訪問(wèn)他的授權(quán)用戶ü 加強(qiáng)基于用戶或角色的訪問(wèn)控制;ü 完全禁止訪問(wèn)未被授權(quán)的頁(yè)面類型(如配置文件、日志文件、源文件等)Ø 驗(yàn)證你的構(gòu)架ü 在每一個(gè)層次都使用簡(jiǎn)單肯定的模型;ü 確保每一層都有一個(gè)訪問(wèn)機(jī)制Ø 驗(yàn)證你的實(shí)現(xiàn)ü 不要使用自動(dòng)化的分析工具;ü 確保每個(gè)URL都被外部過(guò)濾器或其他機(jī)制保護(hù);ü 確保服務(wù)器的配置不允許對(duì)非授權(quán)頁(yè)面的訪問(wèn)u 實(shí)例public boole

43、an isAuthorized(Object key,Object runtimeParameter);public voidassertAuthorized(Object key,Object runtimeParameter) throwsAccessControlException;boolean isAuthorizedForURL(String url);boolean isAuthorizedForFunction(String functionName);boolean isAuthorizedForData(String action,Objectdata);boolean i

44、sAuthorizedForFile(String filepath);boolean isAuthorizedForService(String serviceName);voidassertAuthorizedForURL(String url)throwsAccessControlException;voidassertAuthorizedForFunction(String functionName) throwsAccessControlException;voidassertAuthorizedForData(String action,Objectdata) throwsAcce

45、ssControlException;voidassertAuthorizedForFile(String filepath)throws AccessControlException;voidassertAuthorizedForService(String serviceName) throwsAccessControlException;5.12安全配置錯(cuò)誤5.12.1定義好的安全需要對(duì)應(yīng)用程序、框架、應(yīng)用程序服務(wù)器、web服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器和平臺(tái)定義和執(zhí)行安全配置。由于許多設(shè)置的默認(rèn)值并不是安全的,因此,必須定義、實(shí)施和維護(hù)這些設(shè)置。這包含了對(duì)所有的軟件保持及時(shí)地更新,包括所有應(yīng)用程

46、序的庫(kù)文件。5.12.2危害安全配置錯(cuò)誤可以發(fā)生在一個(gè)應(yīng)用程序堆棧的任何層面,包括平臺(tái)、Web服務(wù)器、應(yīng)用服務(wù)器、數(shù)據(jù)庫(kù)、框架和自定義代碼。這些漏洞使攻擊者能經(jīng)常訪問(wèn)一些未授權(quán)的系統(tǒng)數(shù)據(jù)或功能。有時(shí),這些漏洞導(dǎo)致系統(tǒng)的完全攻破,你的數(shù)據(jù)可能會(huì)隨著時(shí)間推移被全部盜走或者篡改,恢復(fù)的花費(fèi)可能會(huì)很昂貴。5.12.3解決方法Ø 開發(fā)、質(zhì)量保證和生產(chǎn)環(huán)境都應(yīng)該配置相同(每個(gè)環(huán)境中使用不同的密碼)。這個(gè)過(guò)程應(yīng)該是自動(dòng)化的,以盡量減少安裝一個(gè)新安全環(huán)境的耗費(fèi)。Ø 能及時(shí)了解并部署每個(gè)已部署環(huán)境的所有最新軟件更新和補(bǔ)丁的過(guò)程。這需要包括通常被忽略的所有代碼的庫(kù)文件。Ø 應(yīng)用程序架

47、構(gòu)能在組件之間􏰀供有效的分離和安全性。Ø 實(shí)施漏洞掃和經(jīng)常進(jìn)行審計(jì)以幫助檢測(cè)將來(lái)可能的錯(cuò)誤配置或沒(méi)有安裝的補(bǔ)丁。5.13使用含有已知漏洞的組件5.13.1定義組件,比如:庫(kù)文件、框架和其它軟件模塊,幾乎總是以全部的權(quán)限運(yùn)行。如果一個(gè)帶有 漏洞的組件被利用,這種攻擊可以造成更為嚴(yán)重的數(shù)據(jù)丟失或服務(wù)器接管。應(yīng)用程序使用帶有已知漏洞的組件會(huì)破壞應(yīng)用程序防御系統(tǒng),并使一系列可能的攻擊和影響成為可能。5.13.2危害事實(shí)上,大多數(shù)的應(yīng)用都存在這些問(wèn)題因?yàn)榇蠖鄶?shù)的開發(fā)團(tuán)隊(duì)并不會(huì)把及時(shí)更新組件/庫(kù)作為他們的工作重心。在很多情況下,開發(fā)者都不了解他們所使用的全部組件,更不用說(shuō)組件的

48、版本了。組件的依賴性使情況更加糟糕。危害性是包括是由低到高全系列的漏洞,包括注入,不安全的訪問(wèn)控制,XSS等。受影響范圍也從最低的數(shù)據(jù)污染到主機(jī)被完全接管和數(shù)據(jù)的泄漏。針對(duì)具體業(yè)務(wù),從受影響的應(yīng)用中,評(píng)估每個(gè)脆弱點(diǎn)對(duì)業(yè)務(wù)控制來(lái)說(shuō)意味著什么,可能是非常細(xì)微的影響也有可能意味著被完全攻破。5.13.3解決方法Ø 標(biāo)識(shí)正在使用的所有組件及其版本,包括所有的組件(比如版本插件)。Ø 在公共數(shù)據(jù)庫(kù),項(xiàng)目郵件列表和安全郵件列表中時(shí)刻關(guān)注這些組件的安全信息并保證它們是最新的。Ø 建立組件使用的安全策略,比如需要某些軟件開發(fā)實(shí)踐,通過(guò)安全性測(cè)試和可接受的授權(quán)許可。Ø 在

49、適當(dāng)?shù)那闆r下,考慮增加對(duì)組件的安全封裝,去掉不使用的功能和/或安全薄弱的或者組件易受攻擊的方面。5.14未驗(yàn)證的重定向和轉(zhuǎn)發(fā)5.14.1定義Web應(yīng)用程序經(jīng)常將用戶重定向和轉(zhuǎn)發(fā)到其他網(wǎng)頁(yè)和網(wǎng)站,并且利用不可信的數(shù)據(jù)去判定 目的頁(yè)面。如果沒(méi)有得到適當(dāng)驗(yàn)證,攻擊者可以重定向受害用戶到釣魚軟件或惡意網(wǎng)站,或者使用轉(zhuǎn)發(fā)去訪問(wèn)未授權(quán)的頁(yè)面。5.14.2危害這種重定向可能試圖安裝惡意軟件或者誘使受害者泄露密碼或其他敏感信息。不安全的轉(zhuǎn)發(fā)可能允許繞過(guò)訪問(wèn)控制。5.14.3解決方法Ø 避免使用重定向和轉(zhuǎn)發(fā)。Ø 如果使用了重定向和轉(zhuǎn)發(fā),則不要在具體目標(biāo)時(shí)涉及到用戶參數(shù)。Ø 如果使用目標(biāo)參數(shù)無(wú)法避免,應(yīng)確保其所&#

溫馨提示

  • 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)論