国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

JSON和XML數(shù)據(jù)傳輸及其效率、安全性研究

2014-07-15 07:47:08冉淵
卷宗 2014年5期
關(guān)鍵詞:序列化瀏覽器解析

冉淵

摘 要:在Web開(kāi)發(fā)中,如何選擇一種適當(dāng)?shù)臄?shù)據(jù)傳輸格式是一個(gè)非常重要的問(wèn)題。目前,主流的數(shù)據(jù)傳輸格式主要是XML和 JSON二種。在滿(mǎn)足基本需求的情況下,如何選擇更高效、安全的一種傳輸格式就顯得尤其重要。

本文將對(duì)這二種傳輸格式的結(jié)構(gòu)進(jìn)行闡述,并對(duì)比其數(shù)據(jù)傳輸效率及安全性,讓讀者在開(kāi)發(fā)過(guò)程中選擇數(shù)據(jù)傳輸格式有一個(gè)參考的方向。

關(guān)鍵字:JSON;XML;數(shù)據(jù)傳輸;效率;安全性

JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于JavaScript的一個(gè)子集。 JSON采用完全獨(dú)立于語(yǔ)言的文本格式,但是也使用了類(lèi)似于C語(yǔ)言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言。易于人閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成。

XML是Extensible Markup Language 的縮寫(xiě),中文名稱(chēng)是可擴(kuò)展標(biāo)記語(yǔ)言,它源自標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言SGML。XML 是一種格式統(tǒng)一,跨平臺(tái)的語(yǔ)言,早已成為業(yè)界的標(biāo)準(zhǔn)。XML 使用元素和屬性來(lái)描述數(shù)據(jù)。在數(shù)據(jù)傳送過(guò)程中,XML 始終保留了諸如父/ 子關(guān)系這樣的數(shù)據(jù)結(jié)構(gòu)。幾個(gè)應(yīng)用程序可以共享和解析同一個(gè)XML 文件,不必使用傳統(tǒng)的字符串解析或拆解過(guò)程。相反,普通文件不對(duì)每個(gè)數(shù)據(jù)段做描述(除了在頭文件中),也不保留數(shù)據(jù)關(guān)系結(jié)構(gòu)。使用XML 做數(shù)據(jù)交換可以使應(yīng)用程序更具有彈性,因?yàn)榭梢杂梦恢茫ㄅc普通文件一樣) 或用元素名(從數(shù)據(jù)庫(kù))來(lái)存取XML 數(shù)據(jù)。

1 JSON和XML的結(jié)構(gòu)

1.1 XML結(jié)構(gòu)

XML 文檔形成了一種樹(shù)結(jié)構(gòu),它從“根部”開(kāi)始,然后擴(kuò)展到“枝葉”。XML 使用簡(jiǎn)單的具有自我描述性的語(yǔ)法。XML 文檔必須包含根元素,該元素是所有其他元素的父元素。XML 文檔中的元素形成了一棵文檔樹(shù)。這棵樹(shù)從根部開(kāi)始,并擴(kuò)展到樹(shù)的最底端。父、子以及同胞等術(shù)語(yǔ)用于描述元素之間的關(guān)系。父元素?fù)碛凶釉?。相同層?jí)上的子元素成為同胞(兄弟或姐妹)。所有元素均可擁有文本內(nèi)容和屬性(類(lèi)似 HTML 中)。所有元素均可擁有子元素。一個(gè)典型的XML結(jié)構(gòu)如下:

1

a1

http://a1.baidu.com

hello

2

a2

http:// a2.baidu.com

world

1.2 JSON結(jié)構(gòu)

JSON 中的每個(gè)結(jié)構(gòu)單元均由花括號(hào)( { } ) 表示, 每個(gè)結(jié)構(gòu)中可以含有多個(gè)由逗號(hào)( , ) 分隔的成員, 而每個(gè)成員均是一個(gè)名稱(chēng)/ 值對(duì)。每個(gè)名稱(chēng)/ 值對(duì)包含由冒號(hào)( : ) 分隔的兩部分, 前者是名稱(chēng), 后者是值。值不僅可以是普通的數(shù)字、字符串, 也可以是邏輯值(Ture或False),一個(gè)有序列表, 用方括號(hào)( [ ] ) 表示, 其中可以包含以逗號(hào)分隔的多個(gè)值[ ] 。如上例中的XML結(jié)構(gòu)可以用JSON結(jié)構(gòu)表示為:

{comment s:[

{

id:1,

author:"a1",

url:"http://a1.baidu.com" ,

content: "hello"

},

{

id B2,

author : "a2" ,

url:"http://a2.baidu.com" ,

content:"world"

},

] }

2 傳輸效率對(duì)比

2.1 傳輸開(kāi)銷(xiāo)對(duì)比

數(shù)據(jù)傳輸過(guò)程中的開(kāi)銷(xiāo)主要來(lái)源于屬性名稱(chēng)、標(biāo)簽及符號(hào)。以一個(gè)簡(jiǎn)單的數(shù)據(jù)表為例,每一列即為一個(gè)屬性,如圖1 所示。

圖1 數(shù)據(jù)表

XML 分為無(wú)空屬性XML 和含空屬性XML 兩類(lèi)。若用XML 描述第一條數(shù)據(jù)記錄的Tel 屬性,可表示為123。對(duì)于無(wú)空屬性XML,即當(dāng)屬性值為空時(shí),不創(chuàng)建元素,數(shù)據(jù)傳輸開(kāi)銷(xiāo)表示為(2*N+5)*(1-E),5表示開(kāi)關(guān)標(biāo)簽符號(hào)‘( <,‘>,‘/)共5 個(gè)。對(duì)于含空屬性XML,即屬性值為空,但標(biāo)簽及屬性名稱(chēng)仍然保留,若第一條數(shù)據(jù)記錄的Tel 屬性值為空,則用XML 可表示為 ,此時(shí)相當(dāng)于E = 0,XML 數(shù)據(jù)傳輸開(kāi)銷(xiāo)為2*N+5。

對(duì)于JSON,也分為無(wú)空屬性JSON 和含空屬性JSON 兩類(lèi)。若用JSON 表示第一條數(shù)據(jù)記錄,可表示為{“No”:“1”,“Sex”:“female”,“Tel”:“123”,“Age”:“10”}。對(duì)于每個(gè)屬性由于屬性名稱(chēng)無(wú)需成對(duì)出現(xiàn),只需一個(gè)表示,另外包含符號(hào)‘( ",‘",‘:,‘,)共6 個(gè),因此,無(wú)空屬性JSON(當(dāng)屬性值為空時(shí),不創(chuàng)建元素),數(shù)據(jù)傳輸開(kāi)銷(xiāo)可表示為(N+6)*(1-E)。對(duì)于含空屬性JSON(屬性值為空,但標(biāo)簽仍然保留),若第一條數(shù)據(jù)記錄的Tel 屬性值為空,則可表示為{“No”:“1”,“Sex”:“female”,“Tel”“: ”“, Age”“: 10”},即E = 0時(shí),JSON數(shù)據(jù)傳輸開(kāi)銷(xiāo)為N+6。

2.2 解析速度對(duì)比

使用Javascript 解析XML 和JSON 的速度也是比較的項(xiàng)目之一。假定用XML 和JSON 分別描述1000 條employee 記錄,使用Javascript 遍歷這1000 記錄并且讀取name,title,phone 和Email4個(gè)屬性。測(cè)試結(jié)果如下:

①I(mǎi)E8 JSON:77ms;XML: 770ms

②Fire Fox 3 JSON:68ms;XML:198ms

③Safari 4 JSON:69ms;XML:827ms

④Chrome 10 JSON:72ms;XML: 810ms

雖然上述測(cè)試結(jié)果與測(cè)試機(jī)的軟硬件配置有關(guān),但是解析的速度分屬于兩個(gè)數(shù)量級(jí),很明顯,Javascript 解析JSON 的速度遠(yuǎn)遠(yuǎn)快于解析XML。

2.3 反序列化效率對(duì)比

從服務(wù)器端傳輸過(guò)來(lái)JSON 或XML 的數(shù)據(jù)將被反序列化才能獲取其中的數(shù)據(jù),進(jìn)而顯示在客戶(hù)端頁(yè)面上。其中,XML 是基于DOM 樹(shù)結(jié)構(gòu)的,反序列化XML 需要考慮父節(jié)點(diǎn)和子節(jié)點(diǎn),這為反序列化增加了難度。如下是一個(gè)典型的XML 格式表示:

lucy

2009021125

female

反序列化XML 通常采用如下方式:

var student=request.responseXML;

var name=book.getElementsByTagName("name");

alert(name[0].firstChild.textContent);

而JSON 只需要通過(guò)JavaScript 語(yǔ)言的eval( )函數(shù)就可以將JSON 數(shù)據(jù)反序列化為JavaScript 對(duì)象。如下是上述XML示例對(duì)應(yīng)的JSON 格式:

{

"name":lucy,

"stuno":2009021125,

"sex":female

}

反序列化JSON 通常采用如下方法:

var student=eval(request.responseText);

alert(student.name);

顯然,JSON反序列化的效率高于XML反序列化的效率,這是因?yàn)椴捎肑SON格式的數(shù)據(jù)大大降低了反序列化時(shí)的冗余度,使反序列化效率提高。

經(jīng)過(guò)以上分析可以看出,JSON格式的數(shù)據(jù)傳輸效率要比XML格式高。使用JSON 不僅減少了XML 解析帶來(lái)的便利性能問(wèn)題和兼容性問(wèn)題, 而且對(duì)于JavaScript 來(lái)說(shuō)非常容易使用, 可以通過(guò)遍歷數(shù)組以及訪(fǎng)問(wèn)對(duì)象屬性來(lái)獲取數(shù)據(jù), 基本具備了結(jié)構(gòu)化數(shù)據(jù)的性質(zhì)。Google maps 就沒(méi)有采用XML 傳遞數(shù)據(jù), 而是采用了JSON 方案。JSON 的優(yōu)勢(shì)還表現(xiàn)在它的非冗長(zhǎng)性上。在XML 中, 打開(kāi)和關(guān)閉標(biāo)記是必需的, 這樣才能滿(mǎn)足標(biāo)記的依從性; 而在JSON 中, 所有這些要求只需通過(guò)一個(gè)簡(jiǎn)單的括號(hào)即可滿(mǎn)足。在包含有數(shù)以百計(jì)字段的數(shù)據(jù)交換中, 傳統(tǒng)的XML 標(biāo)記將會(huì)延長(zhǎng)數(shù)據(jù)交換時(shí)間。

3 安全性對(duì)比

3.1 JSON安全性

JSON在安全性方面相對(duì)薄弱,JSON只能用于可公開(kāi)的數(shù)據(jù),其他數(shù)據(jù)都不能使用JSON,除非你使用的URL無(wú)法預(yù)測(cè),JSON才是安全的。

這里有兩個(gè)問(wèn)題:一個(gè)是CSRF(Cross Site Request Forgery,跨站點(diǎn)偽造請(qǐng)求攻擊),它允許攻擊者繞過(guò)基于cookie的身份認(rèn)證。另外,維基百科也說(shuō)到了這個(gè),你可以用CSRF在一個(gè)遠(yuǎn)程服務(wù)器上調(diào)用由cookie保護(hù)著的數(shù)據(jù)。黑客可以利用這項(xiàng)技術(shù)把別人銀行賬號(hào)里的錢(qián)轉(zhuǎn)到他的賬戶(hù)中。

還有一種則鮮為人知,那就是JSON/數(shù)組攻擊,這可以讓某個(gè)用戶(hù)在Mozilla上偷取JSON數(shù)據(jù),其實(shí)只要是任何使用當(dāng)代的JavaScript解釋器的平臺(tái)都會(huì)都可以實(shí)施該攻擊。

由于 JSON 是 JavaScript 的子集,所以一般都會(huì)使用 eval() 作為讀取數(shù)據(jù)的方式,如果是針對(duì)可靠的數(shù)據(jù)來(lái)源,在不支持原生 JSON 解析的瀏覽器上面這是最快速的方法。然而由于 eval 方法同樣可以執(zhí)行任意的 JavaScript 代碼,因此當(dāng)數(shù)據(jù)來(lái)源不可靠時(shí)則可能產(chǎn)生安全性問(wèn)題。

其中一種防止不安全代碼出現(xiàn)的解決辦法,是通過(guò)瀏覽器原生支持的 JSON.parse(str) 方法讀取 JSON 數(shù)據(jù),目前已經(jīng)得到大部分主流瀏覽器的支持(IE8+,F(xiàn)irefox 3.5+,Chrome4+/Safari4+,Opera10+),在不支持原生 JSON 對(duì)象的瀏覽器上面可以使用 parseJSON 方法進(jìn)行讀取[1],parseJSON 采用解析器驗(yàn)證讀入的代碼是否真的是 JSON 代碼,這樣就提供了較好的安全性。

另外一個(gè)安全上的問(wèn)題則是跨站請(qǐng)求偽造。這個(gè)問(wèn)題在Javascript中的狀況是,由于Javascript采用了稱(chēng)為“沙盒”的機(jī)制,它限制Javascript引擎僅能引入同一個(gè)站點(diǎn)的代碼,因而某種程度上提高了安全性。

3.2 XML安全性

XML被設(shè)計(jì)用來(lái)存儲(chǔ)和傳輸數(shù)據(jù),任何平臺(tái)上的程序都可以通過(guò)使用XML解析器來(lái)處理XML數(shù)據(jù),不僅僅是web應(yīng)用,還包括數(shù)據(jù)庫(kù)軟件、瀏覽器等等。由于XML的覆蓋面廣,很多軟件都是使用的同一款XML解析庫(kù),如果這套解析庫(kù)存在漏洞,那么無(wú)疑又將影響的范圍擴(kuò)大了。

在XML解析的過(guò)程中,最常見(jiàn)的有三種漏洞:

◆拒絕服務(wù)漏洞

◆XML注入

◆XML外部實(shí)體注入

但是可以通過(guò)XML加密,XML簽名,XML密鑰等手段來(lái)保證XML的安全性。

通過(guò)上面的分析我們可以看出:就安全性而言,由于大部分Javascript庫(kù)都是使用eval()來(lái)解析數(shù)據(jù),存在執(zhí)行惡意JSON數(shù)據(jù)的安全漏洞;當(dāng)然可以使用專(zhuān)門(mén)的JSON解析器來(lái)避免這個(gè)問(wèn)題。相比,XML更安全一些。

4 結(jié)語(yǔ)

XML 和JSON 作為主要的數(shù)據(jù)交換格式,擇適合的數(shù)據(jù)交換格式對(duì)今后的數(shù)據(jù)轉(zhuǎn)換和應(yīng)用程序性能至關(guān)重要。通過(guò)上面的對(duì)比不難看出, JSON比XML更加適合在Web應(yīng)用中作為數(shù)據(jù)交換格式使用。除此之外,JSON規(guī)范簡(jiǎn)單,易于學(xué)習(xí),多種語(yǔ)言開(kāi)發(fā)包使得它易于在項(xiàng)目中使用,無(wú)論是使用JavaScript還是其它編程語(yǔ)言,操作JSON的代碼都相對(duì)較少。JSON在WEB服務(wù)與數(shù)據(jù)存儲(chǔ)方面也有很大的發(fā)展空間。加上越來(lái)越多的AJAX應(yīng)用的出現(xiàn),JSON具有了更大的發(fā)揮其魅力的舞臺(tái)。正是如此,JSON已經(jīng)逐漸成為了WEB開(kāi)發(fā)者的首選數(shù)據(jù)傳輸格式。

參考文獻(xiàn)

[1] JSON并沒(méi)有人們想象中的那樣安全,http://www.csharpwin.com/dotnetspace/1585.shtml

[2] 王照.XML安全性研究與實(shí)現(xiàn)[A].同濟(jì)大學(xué),2006.

[3] 高靜、段會(huì)川. JSON 數(shù)據(jù)傳輸效率研究[A].計(jì)算機(jī)工程與設(shè)計(jì),2011.

[4] 楊樹(shù)林、胡潔萍.JSON數(shù)據(jù)交換格式及其在數(shù)據(jù)驗(yàn)證中的應(yīng)用[A].北京印刷學(xué)院學(xué)報(bào),2008.

[5] 胡千里.比較XML與JSON在Web中的應(yīng)用[A].信息技術(shù),2011.

[6] JSON, http://zh.wikipedia.org/zh-cn/JSON#.E5.AE.89.E5.85.A8.E6.80.A7.E5.95.8F.E9.A1.8C

[7] JSON: The Fat-Free Alternative to XML, http://www.json.org/xml

猜你喜歡
序列化瀏覽器解析
三角函數(shù)解析式中ω的幾種求法
如何建構(gòu)序列化閱讀教學(xué)
甘肅教育(2020年14期)2020-09-11 07:58:36
反瀏覽器指紋追蹤
電子制作(2019年10期)2019-06-17 11:45:14
睡夢(mèng)解析儀
電競(jìng)初解析
商周刊(2017年12期)2017-06-22 12:02:01
相機(jī)解析
Java 反序列化漏洞研究
環(huán)球?yàn)g覽器
再見(jiàn),那些年我們嘲笑過(guò)的IE瀏覽器
作文訓(xùn)練微格化、序列化初探
连平县| 保山市| 四平市| 克什克腾旗| 海门市| 尼玛县| 宜昌市| 磐安县| 阿克陶县| 桃江县| 通化县| 荥阳市| 花莲市| 上饶县| 宜宾县| 太白县| 汾西县| 雷州市| 谢通门县| 利辛县| 咸丰县| 许昌县| 湘阴县| 许昌市| 新密市| 漠河县| 卢湾区| 文安县| 平远县| 扎鲁特旗| 阳山县| 宁河县| 镇平县| 来宾市| 洛南县| 且末县| 胶州市| 巨野县| 布拖县| 夹江县| 阿克苏市|