摘要:基于對象字面量,但是獨(dú)立于任何編程語言,真正重要的是表示法本身,所以在學(xué)習(xí)之前不必先學(xué)習(xí)。鍵必須是字符串,值可以是合法的數(shù)據(jù)類型字符串?dāng)?shù)字對象數(shù)組布爾值或。布爾類型中的布爾值僅可使用小寫形式或,其他任何寫法都會報錯。
什么是JSON
JSON全稱是Javascript Object Notation(對象表示法),是一種在不同平臺間傳遞數(shù)據(jù)的文本格式(數(shù)據(jù)交換格式)。常見的數(shù)據(jù)交換格式有XML、JSON兩種,我們主要研究JSON。
數(shù)據(jù)交換格式十分重要,開發(fā)人員需要使用它們來實(shí)現(xiàn)不同系統(tǒng)之間的數(shù)據(jù)交換。
JSON基于Javascript對象字面量,但是獨(dú)立于任何編程語言,真正重要的是表示法本身,所以在學(xué)習(xí)JSON之前不必先學(xué)習(xí)Javascript。當(dāng)然,有Javascript基礎(chǔ)那是再好不過了。
JSON語法JSON中使用鍵值對的數(shù)據(jù)結(jié)構(gòu),示例如下:
{ "name": "dawei", "age":22, "isMan":true }
名稱始終需要加上雙引號,多個鍵值對使用逗號隔開。
以下兩種表示方式都是錯誤的:
{ name: "dawei" }
這是Javascript對象而不是JSON
{ "name": "dawei" }
這也是Javascript對象,因?yàn)樵贘avascript對象中允許使用單引號代替雙引號。
JSON數(shù)據(jù)交換格式可以作為獨(dú)立的文件存在于文件系統(tǒng)中,文件擴(kuò)展名為.json。在傳遞數(shù)據(jù)的時候需要提前告知接收方接收的數(shù)據(jù)是什么類型。這時候就會涉及到媒體類型,也叫做內(nèi)容類型或者M(jìn)IME類型。常見的MIME類型是text/html,JSON的MIME類型是application/json。
JSON數(shù)據(jù)類型JSON中的數(shù)據(jù)類型包括:對象、字符串、數(shù)字、布爾值、null和數(shù)組。
對象類型JSON中的對象類型十分簡單,JSON本身就是對象,也就是被一對花括號{}包裹的鍵值對的列表。對象可以嵌套使用。
對象可以包含多個鍵值對。
鍵必須是字符串,值可以是合法的 JSON 數(shù)據(jù)類型(字符串, 數(shù)字, 對象, 數(shù)組, 布爾值或 null)。
{ "person":{ "name":"dawei", "age":23, "isBoy":true } }字符串類型
在JSON中字符串必須并且只能使用雙引號包裹起來。在JSON中,鍵都是字符串類型。在Javascript中,使用單引號和雙引號沒有任何區(qū)別。但是JSON不是Javascript對象字面量,它只是基于Javascript對象字面量。
對于JSON解析器來說,當(dāng)一個值以雙引號開始時,它希望接下來的字符串文本以另一個雙引號結(jié)尾。這意味著如果這段字符串本身包含雙引號可能會報錯。這時候我們需要使用反斜杠對字符串中的雙引號進(jìn)行轉(zhuǎn)義。
{ "promo":"He say "Bob`s the best!" at classroom" }數(shù)字類型
JSON中的數(shù)字類型可以是整數(shù)、小數(shù)、負(fù)數(shù)或者是指數(shù)。
布爾類型JSON中的布爾值僅可使用小寫形式:true或false,其他任何寫法都會報錯。
null類型在JSON中,使用null表示一無所有、不存在等意思。
對于下面這個例子,由于對象不戴手表,所以他不存在手表顏色:
{ "freckleCount":0, "fairy":true, "watchColor":null }數(shù)組類型
數(shù)組始終應(yīng)該被方括號[]包裹。數(shù)組中的值使用逗號隔開。
這些值可以是任何合法的JSON數(shù)據(jù)類型。所以可以有字符串構(gòu)成的數(shù)組、數(shù)字構(gòu)成的數(shù)組、布爾值構(gòu)成的數(shù)組、對象構(gòu)成的數(shù)組甚至是數(shù)組構(gòu)成的數(shù)組。
在數(shù)組中也可包含不同數(shù)據(jù)類型的值:
{ "eggCarton":["egg",null,"egg",5,"egg"] }
這在JSON中也是合法的,但是我們應(yīng)該避免這樣使用。因?yàn)槿绻覀儗煌瑪?shù)據(jù)類型的數(shù)組的JSON傳遞給一個不使用Javascript的系統(tǒng),那么在解析的時候很可能會報錯。
JSON 模式(Schema)JSON中的數(shù)據(jù)通過互聯(lián)網(wǎng)或其他網(wǎng)絡(luò)傳輸?shù)浇邮辗剑邮辗綍λ邮盏臄?shù)據(jù)有一個預(yù)期。接收方會提供一個文檔來解釋預(yù)期的格式并且提供示例。此外,JSON模式亦可以被接收方用于傳輸方的另一端。JSON模式往往位于要接收數(shù)據(jù)的第一行,以保證數(shù)據(jù)符合要求。
我們統(tǒng)稱上述做法為“一致性驗(yàn)證”,在這里要驗(yàn)證三個方面的內(nèi)容:
值的類型是否正確——可以具體規(guī)定一個值是數(shù)字、字符串等類型
是否包含所需要的數(shù)據(jù)——可以規(guī)定哪些數(shù)據(jù)是必須的,哪些是不需要的
值的形式是否是我們需要的——可以指定范圍、最小值和最大值
JSON Schema使用JSON來書寫,一個完整的JSON Schema格式的文件如下所示:
{ "$schema":"http://json-schema.org/draft-04/schema#", "title":"Cat", "properties":{ "name":{ "type":"string", "minLength":3, "maxLength":20 }, "age":{ "type":"number", "description":"You cat"s age in years.", "minimum":0 }, "declawed":{ "type":"boolean" }, "description":{ "type":"string" } }, "required":[ "name", "age", "declawed" ] }
在這個文件中,第一個鍵值對聲明了一個schema文件,第二個鍵值對是該文件的標(biāo)題,第三個鍵值對是需要包含在JSON中的屬性,第四個鍵值對指定必須包含的屬性。在屬性值中,又說明了屬性類型、對屬性的描述和值的范圍。
JSON中的安全問題JSON本身不存在任何安全問題,但是在web中使用JSON時卻常出現(xiàn)兩個安全問題:跨站請求偽造和跨站腳本攻擊。
跨站請求偽造跨站請求偽造(CSRF)是一種利用站點(diǎn)對用戶瀏覽器的信任而發(fā)起攻擊的方式。
這個信任其實(shí)就是用戶的登錄憑證,黑客為了得到用戶的憑證,會在用戶登錄站點(diǎn)的情況下向用戶發(fā)送大量的偽造“消息提醒”,目的就是為了讓用戶點(diǎn)擊它,訪問它帶有危險腳本的網(wǎng)站。一旦用戶點(diǎn)擊這一消息提醒、訪問該惡意網(wǎng)站,黑客就可獲取用戶的敏感信息(登錄憑證)實(shí)現(xiàn)攻擊:
一般安全意識較差的網(wǎng)站使用下列這樣的JSON URL存放敏感信息:
[ { "username":"dawei" }, { "phone":"555-555-555" } ]
這里的JSON格式是合法的,但是它十分危險,因?yàn)樗彩强蓤?zhí)行的JS腳本,黑客可以輕易的將其保存到自己站點(diǎn)的腳本中。
如何阻止CSRF攻擊?
首先,應(yīng)該將數(shù)組作為一個值存入JSON對象,這樣數(shù)組將不再是合法的JavaScript,腳本也就無法加載它。
{ "info":[ { "username":"dawei" }, { "phone":"555-555-555" } ] }
其次,站點(diǎn)應(yīng)該只允許post請求,靜止使用get請求。這樣黑客就無法使用腳本中的URL了。
注入攻擊注入攻擊都是利用系統(tǒng)本身的漏洞向網(wǎng)站注入惡意代碼來進(jìn)行攻擊的。
跨站腳本攻擊跨站腳本攻擊(XSS)是注入攻擊的一種。在使用JSON時常見的安全漏洞通常發(fā)生在Javascript從服務(wù)器獲取到一段JSON字符串并將其轉(zhuǎn)化成JavaScript對象的時候。
在JavaScript中,可以使用eval()函數(shù)來進(jìn)行這一操作:
var jsonString = "{"animal":"cat"}"; var myObject = eval("("+ jsonString +")"); alert(myObject.animal);
這好像沒什么問題,但是如果服務(wù)器或者服務(wù)器發(fā)來的JSON被攻擊,攜帶了惡意代碼,這樣的話情況將會很糟糕:
var jsonString = "alert("this is bad code")"; var myObject = eval("("+ jsonString +")"); alert(myObject.animal);
eval()的問題在于它會將傳入的字符串無差別的編譯執(zhí)行,這樣的話就會給黑客以可乘之機(jī),很可能會給我們帶來不可估計的損失。
為了解決這一問題,引入了JSON.parse()方法,這一函數(shù)僅解析JSON,不會執(zhí)行腳本:
var jsonString = "{"animal":"cat"}"; var myObject = JSON.parse("("+ jsonString +")"); alert(myObject.animal);
未完待續(xù)...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67504.html
摘要:基于對象字面量,但是獨(dú)立于任何編程語言,真正重要的是表示法本身,所以在學(xué)習(xí)之前不必先學(xué)習(xí)。鍵必須是字符串,值可以是合法的數(shù)據(jù)類型字符串?dāng)?shù)字對象數(shù)組布爾值或。布爾類型中的布爾值僅可使用小寫形式或,其他任何寫法都會報錯。 什么是JSON JSON全稱是Javascript Object Notation(對象表示法),是一種在不同平臺間傳遞數(shù)據(jù)的文本格式(數(shù)據(jù)交換格式)。常見的數(shù)據(jù)交換格式...
摘要:通過請求和響應(yīng)的交換達(dá)成通信協(xié)議中已經(jīng)規(guī)定了請求是從客戶端發(fā)出,最后由服務(wù)端響應(yīng)這個請求并返回。隨后的字符串指明了請求訪問的資源對象。協(xié)議自身不對請求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存,也就是說這個級別。從前發(fā)送請求后需等待并受到響應(yīng)。 showImg(https://segmentfault.com/img/bVbmDsG?w=1024&h=538); http協(xié)議用戶客戶端和服務(wù)器之間的...
摘要:最近,項(xiàng)目的安全認(rèn)證機(jī)制全面采用。為了伸縮性考慮,采用機(jī)制,必然面臨著應(yīng)用狀態(tài)的問題,而且必然牽涉到的復(fù)制。為了安全性考慮,機(jī)制僅驗(yàn)證時天然對免疫。若有可能,使用標(biāo)志。采用來防止這是因?yàn)椋谡军c(diǎn)上發(fā)起向站點(diǎn)的請求時,站點(diǎn)的同樣會被發(fā)送給。 最近,項(xiàng)目的安全認(rèn)證機(jī)制全面采用JWT。現(xiàn)在,趁整個工作基本告一段落之際,將一些知識點(diǎn)總結(jié)一下發(fā)布出來。 為什么要遷移? 原因很簡單,就以下幾點(diǎn): ...
閱讀 3650·2021-09-22 15:15
閱讀 3555·2021-08-12 13:24
閱讀 1309·2019-08-30 15:53
閱讀 1816·2019-08-30 15:43
閱讀 1178·2019-08-29 17:04
閱讀 2792·2019-08-29 15:08
閱讀 1573·2019-08-29 13:13
閱讀 3084·2019-08-29 11:06