2016-04-17 8 views
2

ビューの1つにグリッドがあり、その中にアクション列が作成されています。その列には、編集と削除のためのボタンがあります。ユーザーが削除ボタンをクリックすると、jQueryを使用してそのクリックイベントにアクセスします。削除ボタンがフォームの一部ではないのでASP.NET MVCでAntiForgeryTokenのないアクションメソッドを削除するのは危険ですか?

// POST: Roles/Delete/5 
[Route("roles/delete")] 
[HttpPost] 
public async Task<IActionResult> RoleDelete(string id) 
{ 
    IdentityRole role = await _roleManager.FindByIdAsync(id); 
    await _roleManager.DeleteAsync(role); 
    return RedirectToAction("RoleIndex"); 
} 

:ここ

$(document).on('click', '.btnDeleteRole', function (e) { 
     e.preventDefault(); 
     if (confirm("Are you sure you want to delete this record?")) { 
      var $this = $(this); //store $(this) to a variable 
      var roleId = $this.attr('data-role-Id'); 

      $.ajax({ 
       type: "POST", 
       url: "/admin/roles/delete", 
       data: { id: roleId }, 
       dataType: "html", 
       success: function (data) { 
        // rebind kendo grid 
       } 
      }); 
     } 
    }); 

私の削除アクションメソッドは次のようになります。ここでは

は私のAjaxのようなルックスを削除するとは何かActionMethodの上にAntiForgeryToken注釈を付けることはできません。

このようなアイテムを削除するのは安全ですか?

+0

トークンをJS経由で渡す必要があります。 – SLaks

+0

本当にグリッド内の行ごとにトークンが必要ですか?フォームに各アイテムをラップする必要はありませんか? –

+0

JSが取得できる限り、単一のトークンを使用できます。 – SLaks

答えて

4

いいえ、安全ではありません。偽造防止薬を使用しない場合は、hereのようにCSRF攻撃にさらされます。

グリッド内のメインフォームの非表示トークンを削除するだけで投稿を削除できます。フォームの非表示のトークンと必要なCookieのトークンがあるため、1行に1つのトークンは必要ありません。

+0

ビューに商品のグリッドリストしかない場合はどうなりますか?反偽造トークンを使用して空のフォームを作成するだけですか?あなたは私がjsを通じてどのようにアクセスできるかを私に知らせることができますか? –

+0

@BlakeRivell Ajaxを介してトークンを送信する場合は、@ Html.AntiForgeryToken()が必要です。フォームの代わりにJsonを投稿している場合は、Ajaxリクエストの詳細を参照してください。 – tede24

関連する問題