2012-04-24 10 views
1

MVC3ブックでJQueryを学習しています。私は、Jsonのデータは本当に使いやすいと思っていますが、安全ではないかもしれません。JQueryオートコンプリートGETおよびJSON配列のデータセキュリティの問題

シナリオを考えてみましょう。例えば、私はセンシティブな顧客情報を持つCRMを持っています。 AjaxはJson配列を検索結果として返します。検索テキストボックスajaxオートコンプリートは、データベースからセンテイブキーワードのJson配列も返します。等。彼らはすべてGETメソッドを使用します。

しかし、JSON配列データの周りに渡すとき、GETメソッドは、脆弱性を持っていると言われて:

http://haacked.com/archive/2009/06/25/json-hijacking.aspx

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

どのようにjQueryの専門家は、そこにこの問題を修正については行くのですか?助けてください。

---編集:---

@グレン。驚くばかり。ありがとうございました。あなたのヒントに基づいて、ここで私は理解したものです。 JSON配列

  • とJSONオブジェクトが配列ここ
  • を包んでMOD 1を返す

    1. 通常のオートコンプリートは、私たちがcontroller.csにtxtlstという名前のグローバルリストを得たと仮定すると、コードであります.cshtmlファイルに...

      // normal one 
          public JsonResult AutoCompleteHelper1(string term) { 
           //if (!Request.IsAjaxRequest()) return null; 
           var lst = txtlst.Where(s => s.StartsWith(term)).ToList(); 
           var res = lst.Select(x => new { value = x }).ToList(); 
           return Json(res, JsonRequestBehavior.AllowGet); 
          } 
          //mod one 
          public JsonResult AutoCompleteHelper2(string term) { 
           //if (!Request.IsAjaxRequest()) return null; 
           var lst = txtlst.Where(s => s.StartsWith(term)).ToList(); 
           var res = lst.Select(x => new { value = x }).ToList(); 
           return Json(new { wrapper= res, name="wrapper" }, JsonRequestBehavior.AllowGet); 
          } 
      } 
      

      、その後...

      <p>Auto Complete Example</p> 
      <input type="text" name="q" id="MyInput1" data-autocomplete-source="@Url.Action("AutoCompleteHelper1", "Home")"/> 
      <input type="text" name="q" id="MyInput2" data-autocomplete-source="@Url.Action("AutoCompleteHelper2", "Home")" /> 
      

      してから.jsファイル内...

      $(document).ready(function() { 
      
          // normal autocomplete 
          $("#MyInput1").autocomplete({ source: $("#MyInput1").attr("data-autocomplete-source") }); 
      
          // mod autocomplete with a wrap 
          $("#MyInput2").autocomplete({ 
           source: function (req, add) { 
            $.getJSON($("#MyInput2").attr("data-autocomplete-source"), req, function (data) { 
             var suggestions = []; 
             $.each(data.wrapper, function (i, o) { 
              suggestions.push(o.value); 
             }); 
             add(suggestions); 
            }); 
           } 
          }); 
      }); 
      

      --- EDIT 2:---

      POSTを使用するように私に言っているそれらのコメントを無視してください。彼らは はブログのリンクを読んでいないか、問題を理解していません。

    +1

    まず、GETを使用する代わりにPOSTを使用してください – Jorge

    +0

    あなたはそれを検証するために何らかの種類のキーを送信するポストリクエストを使うことができます...これらの例は、あなたのサーバーへの攻撃ではなく、ユーザーに対する攻撃です;ユーザーは一般的に、セキュリティに関しては最も弱いリンクです。 – JKirchartz

    +0

    @Tomその後、別のコントロールを使用します。 AJAX HTTPリクエストに使用されるメソッドは、最終的にはあなたの決定です。既製のツールが適切なことをしない場合は、別のツールを見つけたり、独自のツールを実装したりしてください。 – Pointy

    答えて

    2

    もう1つの方法は、JSONオブジェクトをJSONオブジェクト内にラップすることです。その中の記事とコメントがこの質問に答えました。

    編集:記事から :これはJSONの配列であることを

    事実が重要です。 JSON配列を含むスクリプトは有効なJavaScriptスクリプトであるため、実行することができます。 JSONオブジェクトだけを含むスクリプトは、有効なJavaScriptファイルではありません。

    json配列をオブジェクト{"myJsonArray":{{"name": "sensitive"}、{"name": "data"}}}にラップすると、HTMLスクリプトタグはできません実行する。

    2

    Ajax/JSONP/JSON呼び出しのセキュリティは、Ajax要求がhttp要求であるため、http呼び出しのセキュリティとまったく同じことです。あなたがそれをどう扱うかは変わりません。ユーザーがログインしていて、情報にアクセスできることを確認します。

    データがキャッシュされることが懸念される場合は、Postを使用するか、バックエンドで適切なキャッシングヘッダーを設定しないでください。

    EDIT:あなたが読まれてからJOSNを防ぐために行うことができ

    • 物事無限ループのトリックです。コールの前にinfinteループを張っておくと、Ajaxコールを使用する前にこれを削除する必要があることを意味します。
    • キーを使用できます。サードパーティのサイトでは、要求の検証に必要なキーがありません。
    • 参照元を確認できます。
    +0

    ポイントはAjaxではありません。私はJsonデータを取得するためにhttp呼び出しを行うことができます。 JsonのデータをGETすると、ここで私が話していることです。 – Tom

    +0

    通常のページの読み込みと同じようにhttp呼び出しが問題ではありません。それは同じことです。それはすべてwebservice、同じルールが適用されます!例えば、 – epascarello

    +0

    はjqueryオートコンプリートを受け取りますが、method:POSTのようなオプションはありません。それはGETだけです。私はサーバー側のMVC sayJsonRequestBehavior.AllowGetで穴を開ける必要がある、またはコードが動作しません。 – Tom

    関連する問題