5

MVC の AntiForgeryToken 属性を使用する方法を知っています。これは、アプリケーションのフォーム POST を XSRF で保護するのに役立つ HTML ヘルパーに関連付けられています。

GET を実装する JsonResults に対して同様のことができますか?

たとえば、私のビューには、次のような onSubmit jQuery 呼び出しが含まれています。

$.getJSON("/allowActivity/YesOrNo/" + someFormValue, "{}", function(data) {
  if(data.Allow) {
    //Do something.
  }
});

この JsonResult が目的のページからのみ呼び出し可能であることを確認したいと思います。

編集:

同様の質問に関するこの投稿を見つけましたが、具体的な回答はありません。

GET (非破壊) URL が自分のページからの AJAX 呼び出しによってのみ消費されるようにする最も簡単な方法は何ですか?

4

4 に答える 4

8

AntiForgeryToken をいくつかのカスタム ロジックと組み合わせて使用​​できます。サーバーでの AntiForgery トークンの作成は同じですが、既定では値は XmlHttpRequest に含まれていません。

このトークンの値は、HTTP のみの Cookie「__RequestVerificationToken」にあり、サーバーに送信されるフォーム データにも含まれている必要があります。したがって、XmlHttpRequest にキーと値のペアを含め、コントローラーで ValidateAntiForgeryToken - 属性を使用します。

編集:

今日、Ajax リクエストに AntiForgeryToken を自分で使用してみましたが、問題なく動作します。次の JavaScript を使用するだけです。

$.post('my_url',  $.getAntiForgeryTokenString(), function() { ... });

$.getAntiForgeryTokenString = function() {
    return $(document.getElementsByName("__RequestVerificationToken")).fieldSerialize();
};

サーバー側では、コードを変更する必要はありません。アクションに ValidateAntiForgeryToken- 属性を使用するだけです。

お役に立てれば

于 2009-02-16T22:41:30.377 に答える
1

まず、getJSON の代わりに $.post(url, data, callback, 'json') を使用しないのはなぜですか? そして kleolb02 が言ったように、 Cookie プラグインを使用して、Cookie から投稿データに値を追加できます- {__RequestVerificationToken: $.cookie('__RequestVerificationToken')}

于 2009-02-16T23:48:44.820 に答える
1

ASP.NET MVC プロジェクトで同様のコードを使用して、Ajax フォームを使用せずに要素のぼかし関数を使用しました。このコードは、特定の HTML 要素の Blur イベントが発生したときに、テキスト フィールドにサーバー データを入力します。

これも役立つことを願っています。これが私のコードです:

Javascript:

var mytext = { 'myText': 'example text' };
$.post('/MyController/JsonResultMethod', AddAntiForgeryToken(myText), function (resultData) {
        $('#htmlElement').val(resultData);
});
AddAntiForgeryToken = function (data) {
    data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();
    return data;
};

Cシャープコード:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public JsonResult SeoString(string myText)
    {
        try
        {
            // do something here
            return this.Json("result text");
        }
        catch (Exception)
        { return this.Json(string.Empty); }
    }
于 2012-02-10T02:03:55.347 に答える
0

アンチ XSRF メソッドと同様のことができます。ID を生成して JavaScript に挿入し、ユーザーが JSON URL を呼び出したときに、その URL に生成された ID を含めて、そこにあるかどうかを確認します。

XSRF に対する防御もセッション ID をキーとして使用していますが、これはユーザーが自分のアカウントで別の Web サイトから実行するのを止めません。

セッションと時間に基づくいくつかのハッシュがうまくいくかもしれません。もちろん、ユーザーが JS から値をコピーした場合でも、別の場所から実行できますが、その値を x 分ごとに期限切れにすることができます。別のオプションは、JS で Cookie を設定し、サーバー側で読み取ることです。

これがあなたが始めるためのいくつかのアイデアを与えることを願っています.

于 2009-02-16T22:30:25.770 に答える