『JSON必知必ず会』学習ノート(一)

5901 ワード

JSONとは
JSONはJavascript Object Notationと呼ばれ、異なるプラットフォーム間でデータを転送するテキスト形式(データ交換フォーマット)です.よくあるデータ交換フォーマットはXML、JSONの2種類があります.私達は主にJSONを研究しています.
データ交換フォーマットは非常に重要で、開発者はそれらを使って異なるシステム間のデータ交換を実現する必要があります.
JSONはJavascriptオブジェクトの字面量に基づいていますが、どのプログラミング言語にも独立しています.本当に重要なのは表示法そのものです.だからJSONを学ぶ前にJavascriptを勉強する必要はありません.もちろん、Javascriptの基礎があれば、それに越したことはないです.
JSON文法
JSONでキーパッドペアを使ったデータ構造の例は以下の通りです.
{
    "name": "dawei",
    "age":22,
    "isMan":true
}
名前は常に二重引用符を付け、複数のキーはコンマで区切られます.
以下の2つの表現はいずれもエラーです.
{ name: "dawei" }
これはJavascriptの対象です.JSONではありません.
{ 'name': 'dawei' }
これもJavascriptの対象です.Javascriptオブジェクトの中でダブルクォーテーションの代わりにシングルクォーテーションを使用することができます.
JSONデータ交換フォーマットは、独立したファイルとしてファイルシステムに存在することができ、ファイル拡張子は.jsonです.データを送るときは、受信者にどのようなタイプのデータがあるかを事前に通知する必要があります.この場合はメディアタイプにも関わらず、コンテンツタイプやMIMEタイプとも言われます.よくあるMIMEタイプはtext/htmlで、JSONのMIMEタイプはaplication/jsonです.
JSONデータタイプ
JSONにおけるデータの種類は、オブジェクト、文字列、数字、ブール値、null、および配列を含む.
オブジェクトの種類
JSONの中のオブジェクトタイプは非常に簡単で、JSON自体は対象であり、つまり一対の括弧{}に包まれたキーパッドのペアのリストである.オブジェクトは入れ子で使用できます.
オブジェクトには複数のキーのペアが含まれます.キーは文字列でなければなりません.値は合法的なJSONデータタイプ(文字列、数字、オブジェクト、配列、ブール値またはnull)です.
{
    "person":{
        "name":"dawei",
        "age":23,
        "isBoy":true
    }
}
文字列の種類
JSONには文字列が必要で、ダブルクォーテーションマークでしか包みません.JSONでは、キーはすべて文字列タイプです.Javascriptではシングルクォーテーションとダブルクォーテーションを使っても違いがありません.しかし、JSONはJavascriptオブジェクトの字面量ではなく、Javascriptオブジェクトの字面量に基づいているだけです.
JSON解析器では、値が二重引用符で始まると、次の文字列のテキストが別の二重引用符で終わることが望ましい.この文字列自体に二重引用符が含まれているとエラーが発生する可能性があるということです.このとき、文字列の二重引用符を逆傾斜棒で変換します.
{
    "promo":"He say \"Bob`s the best!\" at classroom"
}
数の種類
JSONの数字の種類は、整数、小数、負または指数とすることができます.
ブールの種類
JSONの中のブール値は小文字だけでいいです.trueまたはfalseは他のどの書き方でもエラーが発生します.
nullタイプ
JSONでは、nullを使って、何もない、存在しないという意味です.
この例では、相手は腕時計をしていないので、腕時計の色はありません.
{
    "freckleCount":0,
    "fairy":true,
    "watchColor":null
}
配列の種類
配列は常に四角括弧[]によって包まれるべきである.配列の値はカンマで区切られます.
これらの値は任意の合法的なJSONデータタイプであってもよい.したがって、文字列で構成される配列、数字で構成される配列、論理値で構成される配列、オブジェクトで構成される配列、さらには配列で構成される配列があり得る.
配列には異なるデータタイプの値も含まれています.
{
    "eggCarton":["egg",null,"egg",5,"egg"]
}
これはJSONにおいても合法的ですが、私達はこのような使い方を避けるべきです.私たちが異なるデータ型の配列を含むJSONをJavascriptを使用しないシステムに伝達すると、解析時にエラーが発生する可能性が高いからです.
JSONモード(Schema)
JSONのデータはインターネットまたは他のネットワークを通じて受信者に伝送され、受信者は受信するデータに対して期待がある.受信者は予想されるフォーマットを説明する文書を提供し、例を提供する.さらに、JSONモードは、送信側の他端に対しても受信者によって使用されてもよい.JSONモードは、データが要求に適合することを保証するために、データを受信する最初の行にあることが多い.
上記の方法を総称して「一致検証」と呼びます.ここで三つの方面の内容を検証します.
  • 値の種類が正しいかどうか――具体的には、1つの値が数字、文字列などのタイプ
  • であることが規定されています.
  • には必要なデータが含まれていますか?どのデータが必要ですか?必要でないものが
  • です.
  • 値の形式は必要ですか?範囲、最小値、最大値を指定できます.
  • 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ファイルを宣言しました.第二キーのペアはこのファイルのタイトルです.第三キーのペアはJSONに含まれる属性が必要で、第四キーの値は指定に含まれる属性を指定します.属性値には、属性タイプ、属性に対する記述、値の範囲が示されている.
    JSONにおける安全問題
    JSON自体には安全問題は存在しませんが、webでJSONを使用すると2つの安全問題が発生します.
    駅をまたいで偽造を要求する
    クロスステーション要求偽造(CSRF)は、サイトのユーザブラウザへの信頼を利用して攻撃を開始する方法である.
    この信頼は実はユーザーの登録証明書であり、ハッカーはユーザーの証明を得るために、ユーザーがサイトにログインした場合、大量の偽の「メッセージ・リマインダ」をユーザーに送信します.目的はユーザーにクリックさせるために、危険なシナリオを持ったウェブサイトにアクセスすることです.ユーザーがこのメッセージをクリックして警告し、悪意のあるサイトにアクセスすると、ハッカーはユーザーの敏感情報(登録証明書)を取得して攻撃を行うことができます.
    
    
    に が いサイトは のようなJSON URLを って な を します.
    [
        {
            "username":"dawei"
        },
        {
            "phone":"555-555-555"
        }
    ]
    
    ここのJSONフォーマットは ですが、それは に です.JSスクリプトも できるので、ハッカーは に のサイトのスクリプトに できます.
    CSRF をどう しますか?
    まず、 をJSONオブジェクトに として けるべきです.そうすると、 は なJavaScriptではなく、スクリプトも み めなくなります.
    {
        "info":[
            {
                "username":"dawei"
            },
            {
                "phone":"555-555-555"
            }
        ]
    }
    
    に、サイトは、post のみを し、 get を うべきである.これではハッカーは のURLを えなくなります.
    を ぎ む
    は、システム の を して、ウェブサイトに のコードを して します.
    サイドスクリプト
    クロススクリプト (XSS)は の である.JSONを するときによくあるセキュリティ・ホールは、JavascriptがサーバからJSON を し、JavaScriptオブジェクトに するときに する.
    JavaScriptでは、eval() を してこの を うことができる.
    var jsonString = '{"animal":"cat"}';
    var myObject = eval("("+ jsonString +")");
    alert(myObject.animal);
    
    これは ないようですが、サーバーやサーバーから られてきたJSONが され、 のコードを っています.これは です.
    var jsonString = "alert('this is bad code')";
    var myObject = eval("("+ jsonString +")");
    alert(myObject.animal);
    
    eval()の は、 ってきた を にコンパイルして することにあります.そうすると、ハッカーに できる を えて、 もり な をもたらすかもしれません.
    この を するために、JSON.parse() を しました.この はJSONのみを し、スクリプトは されません.
    var jsonString = '{"animal":"cat"}';
    var myObject = JSON.parse("("+ jsonString +")");
    alert(myObject.animal);