1

MVC3の本でJQueryを学んでいます。Json データは非常に使いやすいと思いますが、安全ではない可能性があります。

たとえば、機密性の高い顧客情報を含む CRM を入手したとします。Ajax は検索結果として Json 配列を返します。検索テキストボックス ajax オートコンプリートは、データベースから機密性の高いキーワードの Json 配列も返します。etc...すべてGETメソッドを使用しています。

ただし、GET メソッドには Json 配列データを渡す際に脆弱性があると言われています。

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 の専門家は、この問題をどのように修正していますか? 助けてください。

- - 編集: - -

@グレン。素晴らしい。ありがとうございました。あなたのヒントに基づいて、ここに私が考え出したものがあります。

  1. json 配列を返す通常のオートコンプリート
  2. そして、配列をラップするjsonオブジェクトを持つmodのもの

controller.cs で txtlst という名前のグローバル リストを取得したと仮定して、コードを次に示します...

    // 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);
    }
}

そして.cshtmlファイルで...

<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);
            });
        }
    });
});

--- 編集 2: ---

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

4

2 に答える 2

2

もう 1 つのオプションは、JSON オブジェクト内で JSON 配列をラップすることです。記事とその中のコメントは、この質問に答えています。

編集:記事から:

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

json 配列をオブジェクト {"myJsonArray":[{"name":"sensitive"},{"name":"data"}]} でラップすると、HTML スクリプト タグを実行できなくなります。

于 2012-04-24T15:09:33.813 に答える
2

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

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

編集:

  • JOSN が読み込まれないようにするためにできることは、無限ループのトリックです。呼び出しの前に無限ループを挿入します。つまり、Ajax 呼び出しでは、使用する前にこれを削除する必要があります。
  • キーを使用できます。サードパーティのサイトには、リクエストの検証に必要なキーがありません。
  • リファラーを確認できます。
于 2012-04-24T14:28:13.433 に答える