TOP 10 Web應(yīng)用脆弱性之一:未經(jīng)驗(yàn)證的輸入
描述
Web 應(yīng)用使用HTTP 請求(也許還有文件,也是一種特殊請求) 來進(jìn)行輸入,并決定如何進(jìn)行響應(yīng)。攻擊者可以篡改HTTP 請求的任何部分,包括url,查詢字符串(querystring), headers, cookies, 表單字段(包括隱藏字段),試圖繞過服務(wù)器的安全機(jī)制。常見的通用輸入篡改攻擊包括:
o 強(qiáng)迫瀏覽(forced browsing);
o 命令注入(command insertion);
o 交叉站點(diǎn)腳本(cross site scripting);
o 緩沖區(qū)溢出(buffer overflows);
o 格式字符串攻擊(format string attacks);
o SQL注入(SQL injection);
o 有毒餅干(cookie poisoning);
o 隱藏字段操作(hidden field manipulation),等等。
某些站點(diǎn)試圖通過過濾惡意輸入來保護(hù)自己。但問題是編碼信息的方式無窮無盡。這些編碼方式看起來并不是加密的,所以似乎也用不著解碼。但是,開發(fā)人員仍然經(jīng)常忘記將所有的參數(shù)在使用之前解碼為最簡單的形式。參數(shù)應(yīng)該在其被校驗(yàn)之前轉(zhuǎn)換為最簡單的形式,否則,惡意輸入就可能掩飾自己從而流過過濾器。簡化這些編碼的過程稱為是“規(guī)格化(canonicalization)”。因?yàn)閹缀跛械?SPAN lang=EN-US>HTTP 輸入都可以編碼為多種格式,這種技術(shù)便可以打亂各種旨在利用和攻擊上述弱點(diǎn)的攻擊行為。這使得過濾非常困難。
有非常之多的web 應(yīng)用僅使用客戶端校驗(yàn)來驗(yàn)證輸入。客戶端校驗(yàn)機(jī)制是非常容易繞過的,這樣就使得Web應(yīng)用幾乎對惡意參數(shù)的攻擊毫無保護(hù)。攻擊者可以使用攻擊甚至telnet來產(chǎn)生他們自己的HTTP 請求。他們才不關(guān)心開發(fā)人員預(yù)定想要在客戶端發(fā)生的時(shí)候事情呢。注意,客戶端校驗(yàn)僅僅在提高性能和可用性方面有益,但是它毫無安全可言。因此,對于惡意參數(shù)攻擊,服務(wù)器端校驗(yàn)是必須的。
這種攻擊的數(shù)量在不斷上升,因?yàn)橛写罅康闹С謪?shù)的“模糊化”(“fuzzing”)、腐朽(corruption)、以及野蠻強(qiáng)制增長的工具出現(xiàn)。不應(yīng)該低估了這些使用非校驗(yàn)輸入進(jìn)行攻擊的影響。實(shí)際上如果開發(fā)人員能夠在使用參數(shù)之前對其進(jìn)行驗(yàn)證,就可抵擋大部分的攻擊。因此,最好使用一個(gè)中心化的、強(qiáng)大的驗(yàn)證機(jī)制來對所有HTTP 請求的輸入都進(jìn)行驗(yàn)證,這樣利用此弱點(diǎn)進(jìn)行攻擊的數(shù)量就會大減。
環(huán)境影響
所有web servers, application servers, 以及應(yīng)用環(huán)境都容易受到這種參數(shù)篡改的攻擊。
如何決定你的應(yīng)用是否脆弱
一個(gè)Web應(yīng)用所用的未經(jīng)驗(yàn)證的HTTP請求的任何和部分都稱為是“臟” 參數(shù)。找出臟參數(shù)的最簡單的方式是進(jìn)行最詳細(xì)的代碼評審,找出所有從HTTP請求提取信息的方法調(diào)用。比如,在J2EE應(yīng)用中,這些包括HttpServletRequest 類(以及其子類)中的方法。然后你就可以循著代碼查看參數(shù)變量是在哪里使用的。如果變量在使用之前未作驗(yàn)證,這可能就是一個(gè)潛在的問題。在Perl中,你因該考慮使用 “taint” (-T) 選項(xiàng)。
你也可以通過一些工具來找出臟參數(shù),比如OWASP的 WebScarab。它們可以查看和評審?fù)ㄟ^HTTP/HTTPS的所有數(shù)據(jù),并進(jìn)行分析。
如何保護(hù)
保護(hù)很簡單,那就是確保任何參數(shù)在被使用之前都進(jìn)行了驗(yàn)證。最好的辦法是使用一個(gè)中心化的組件庫,比如Java中的Jarkarta Commons Validator.每個(gè)參數(shù)都演進(jìn)行嚴(yán)格檢查。涉及到過濾臟數(shù)據(jù)的“負(fù)面”方法或者依賴于簽名的方法都不可能很有效率,并且難以維護(hù)。
參數(shù)應(yīng)該進(jìn)行“正向”規(guī)格的檢查,正向規(guī)格( “positive” specification )的定義可包括:
- 數(shù)據(jù)類型(string, integer, real, 等)
- 允許的字符集
- 最大最小長度
- 是否允許null
- 是否必需
- 是否允許重復(fù)
- 數(shù)值范圍
- 特定的法定值 (枚舉)
- 特定模式(正則表達(dá)式)
* 本系列整理自 OWASP(Opensource Web Applicaiton Security Project )
?EXADEL?Studio的3.0發(fā)布了,我個(gè)人認(rèn)為這是eclipse平臺的輕量IDE中比較好的了。M7的Nitrox不錯(cuò),但是很貴哦。而且............加密做的不錯(cuò),很難找到CRACK的。
從2.5版本開始,他就分為了標(biāo)準(zhǔn)版和Pro版,前者是免費(fèi)的,后者收費(fèi)。3.0Pro版本同樣為$99,可以說非常便宜了。而Nitrox同時(shí)支持JSF和Struts的版本居然是$699。
關(guān)于其新特征,可以查看:Pro版:http://www.exadel.com/products_exadelstudiopro.htm? 標(biāo)準(zhǔn)版:http://www.exadel.com/products_exadelstudio.htm。
有幾個(gè)特征值得一提:
導(dǎo)航圖:
Tree視圖編輯器:

特別是支持表達(dá)式的幫助:

這點(diǎn)非常不錯(cuò),看好!
?
對Struts的支持,除了常規(guī)的導(dǎo)航流圖,配置編輯,可視化驗(yàn)證,之類,還直支持TILES的可視化,這點(diǎn)有很大進(jìn)步,但是和Nitrox比還是有些差距,后者能夠支持JSP編輯器中的TILES WYSWYG效果。
還有個(gè)有趣的特征是Struts配置文件的Debug, 直接在圖形上就可以設(shè)置斷點(diǎn)。
?
另外的改進(jìn)就是支持JSP 的WYSWYG編輯。
?
PRO版與標(biāo)準(zhǔn)版的支持在于對Hibernate 和Spring 的支持,以及JSP的可視化編輯。其中Hibernate 支持可視化MAP編輯。Spring 則是有Spring IDE提供,無新意。
?
哈哈,我決定在我后面的Spring 和struts的書中,以它作為演示工具。
Borland 最近宣布了將要升級JBuilder IDE的相關(guān)信息。基于Eclipse平臺,Borland JBuilder 2006 將提供端對端的開發(fā)人員協(xié)作功能,以提高對標(biāo)準(zhǔn)的支持和生產(chǎn)力增強(qiáng)。但是這恐怕不是令大家關(guān)注的地方,大家感興趣的還是Eclipse平臺。
BEA公司也意圖將其IDE Workshop的未來版本轉(zhuǎn)向Eclipse平臺,在加上IBM Websphere Studio(現(xiàn)在叫Rational Software Architect和Rational Application Developer),似乎eclipse的勢力在妄圖一統(tǒng)天下。著名的Java IDE只剩下Oracle 的JDeveloper和IDEA了。但是實(shí)際上Java IDE 卻是陰云密布,不容樂觀。
基于Eclipse的 JBuilder,代號為Peloton。大約會在明年中期發(fā)布。它將會包含 JBuilder的可用性和協(xié)作特征,加上應(yīng)用生命周期管理。
近兩年Eclipse社區(qū)不斷發(fā)展壯大,以致在Eclipse3發(fā)布的時(shí)候,瘋狂下載造成服務(wù)器幾乎癱瘓。因此,在Java IDE市場上, Eclipse估計(jì)占到20-30%的市場分額。.
因此,這種增長令商業(yè)的專用IDE廠商非常不安,前不久 Oracle終于宣布其JDeveloper向開發(fā)人員免費(fèi),僅對支持收費(fèi)。就是一種無可奈何的反應(yīng)。它們認(rèn)為,Eclipse (包括商業(yè)和開源平臺)的開發(fā)工具已經(jīng)占據(jù)了50%的半壁江山,Oracle在J2EE方面一直不太理想,還不如讓JDeveloper免費(fèi),也好做為Oracle Java的形象大使,賺回些關(guān)注。
但是實(shí)際上,Eclipse提供的是一個(gè)骨架平臺,當(dāng)然Eclipse本身也提供一些開源的Plugins,也有其他一些廠商在提供商業(yè)的插件支持,比如MyEclipse, Lomboz, Exadel等等。還有其它一些開源的專用插件,層出不窮。
因此,Eclipse-Based IDE實(shí)際上成為兩種派系:OS和商業(yè)的。就商業(yè)來說,IBM是最嬉笑顏開的,Eclipse本身就是它鼎力支持的,從WSAD到RAD和RSA,IBM成功地將Rational 品牌產(chǎn)品和Websphere進(jìn)行了整合,Rational體系如今專注軟件開發(fā)生產(chǎn)和測試,而RAD和RSA則提供了業(yè)界最高標(biāo)準(zhǔn)的,包含基本IDE支持,標(biāo)準(zhǔn)支持,協(xié)作,軟件生命周期(甚至集成了RUP),MDA等功能為一體的開發(fā)平臺。
當(dāng)然,基于Eclipse的商業(yè)IDE和開源IDE會否共存?答案當(dāng)然是肯定的。最簡單的原因就是,Java雖然是標(biāo)準(zhǔn),但是廠商自有獨(dú)門功夫,因此,IDE商業(yè)平臺自然帶有一定的專有性。如果是大型的企業(yè)應(yīng)用,需要優(yōu)化等等,則非商業(yè)IDE莫屬。
另外一個(gè)就是Java本身的未來,輕量架構(gòu)和方法的發(fā)展,比如如火如荼的IoC,MetaFramework等等,則又大大促進(jìn)了開源IDE的發(fā)展。
因此,一定時(shí)期內(nèi),這兩種肯定會共存。IDE的較量,背后還是AS和基礎(chǔ)平臺的較量。
Borland的未來核心是構(gòu)建一個(gè) Borland Core Software Delivery Platform (SDP), 也都基于Eclipse。JB只是其中一個(gè)組件。
SUN的IDE則有些尷尬,NetBeans 一直沒什么人感興趣。現(xiàn)在,SUN的另一個(gè)IDE, Java Creator則讓人摸不清到底是何意思。Creator的意圖是想借JSF的組件架構(gòu),構(gòu)造一個(gè)輕量的開發(fā)環(huán)境,并且還苦心構(gòu)造了一個(gè)輕量的后臺的數(shù)據(jù)支持。這明顯和SUN的J2EE架構(gòu)矛盾,真是搞不懂。不過,Creator對快速開發(fā)(RAD)倒是頗有點(diǎn)像VS.NET的那么點(diǎn)樣子,可惜是SUN在經(jīng)營,恐怕也不會對MS造成什么威脅。
另外一個(gè)IDEA則也有一大幫擁甭。IDEA有些地方卻有獨(dú)到之處。其它倒是不說,不過IDEA的下一版(恐怕不妥)fabrique倒是非常有意思,它在常規(guī)的IDE之上構(gòu)建了一個(gè)專門的應(yīng)用框架,并且在IDE(應(yīng)該說是RAD開發(fā)平臺)提供了業(yè)務(wù)對象框架,Web應(yīng)用框架,以及通用的服務(wù)(稱為Active Libraries)(Forum,Email,...)的支持。非常具有特色。我個(gè)人十分欣賞。這點(diǎn)恐怕只是Oracle ADF可以與之一比。
呵呵,先說這么多。
有一個(gè)免費(fèi)的Java在線教程,看樣子是一個(gè)SUN的專家掌控的,名字 sang.shin ,中國人?韓國人?
其中有很多非常好的材料,有詳細(xì)的課程表,還包括PPT材料,講課錄音,實(shí)驗(yàn)材料等等。我覺得非常有價(jià)值。
你還可以注冊到一個(gè)相關(guān)的yahoo群組參與到課程中。初學(xué)者不妨試試。雖然是英文的,不過也不要怕,還可以學(xué)習(xí)英文,豈不更好?
地址是:http://www.javapassion.com
Roger Kitain ( JavaServer Faces co-specification lead )在其blog宣布了開源的 "Open JavaServer Faces" ,并且在基于OSI-approved CDDL許可之下。
原來SUN JSF RI 是基于 Sun Java Research License [Sun, JRL]對”開放開發(fā)”發(fā)布。基本上,這意味著你可以免費(fèi)獲得它的代碼和源代碼,并且你可以修改和分發(fā)它,只要你不是用作商業(yè)目的, 或者用作內(nèi)部非生產(chǎn)之用。如果你修改了二進(jìn)制代碼和源代碼用作商業(yè)用途或者內(nèi)部生產(chǎn)之用,你必須使用商業(yè)許可證并且通過 JSF 技術(shù)兼容包 (TCK)的測試。你也可以提交補(bǔ)丁給 JSF RI 代碼基。
并且在Java.net社區(qū)也launch了一個(gè)專門的項(xiàng)目Javaserver Faces,地址是:https://javaserverfaces.dev.java.net/
Ed Burns 也在其BLog中公布了 JavaServer Faces 1.2 和 JavaServer Pages 2.1 Proposed Final Draft Specification的一些細(xì)節(jié):
將JSP,JSTL和Faces EL統(tǒng)一起來,并且類似于 OGNL 的使用方式。這將極度方便表現(xiàn)層之間的整合,和MVC之間的簡化。
- 針對JSP/JSF應(yīng)用的新的Tree 創(chuàng)建和內(nèi)容交織模型(Content Interweaving Model)。
雖然可以不用JSP而使用Faces,但是因?yàn)榧夹g(shù)、技能和各種生產(chǎn)開發(fā)環(huán)境的支持,JSP/JSF應(yīng)用確實(shí)最現(xiàn)實(shí)和富有效率的。當(dāng)然,這里還有一些集成問題,比如OnJava中的 Hans Bergsten 的這篇文章所述。 所以規(guī)范中將修改針對JSP的Faces ViewHandler 的實(shí)現(xiàn),以及所有Faces組件標(biāo)簽所用的JSP定制標(biāo)簽句柄的基類的實(shí)現(xiàn)來解決這些問題。
有一個(gè)問題是JSTL不支持PostBack,所以使用 JSTL的 <c:forEach> 包含F(xiàn)aces 輸入組件會出現(xiàn)問題。所以需要在JSTL中引入類似于PostBack的新概念,將在下一個(gè)版本中發(fā)布,并且更好地支持所有Faces組件。
- Back Button 問題和多 Frame 或Multi Window Faces 應(yīng)用。
因?yàn)樵贛ulti Frame 或者 Multi Window 應(yīng)用中使用Facesa在State Management API方面會出問題,即瀏覽器的Back按鈕會造成狀態(tài)錯(cuò)誤。這個(gè)問題已經(jīng)解決。
- 將消息與頁面中的某個(gè)特定的組件相關(guān)聯(lián)。
- AJAX support
- 暴露一個(gè)application 層面的 ResourceBundle 給 EL.
添加了一個(gè)新的 <resource-bundle>到 faces-config 中,列出應(yīng)該暴露給使用ELResolver 鏈的EL的資源束。這樣可以優(yōu)化性能。
原文見:http://weblogs.java.net/blog/edburns/archive/2005/08/javaserver_face_3.html