Asp.net mvc 避免CSRF这样做的一个好做法是什么?(ASP.NET MVC 3)

Asp.net mvc 避免CSRF这样做的一个好做法是什么?(ASP.NET MVC 3),asp.net-mvc,csrf,antiforgerytoken,Asp.net Mvc,Csrf,Antiforgerytoken,我有一个关于使用MVC 3提供的AntiForgeryToken的问题 我会尽力解释我的想法 其基本思想是使用Ajax按钮“标记为收藏”目录中的一个(或多个)项目。 因此,我有一个包含整个项目列表的网格,每个项目都有一个按钮作为收藏夹 嗯。。。我的想法是: 当用户按下favorite按钮时,将向服务器发送GET请求,以检索带有AntiForgeryToken的partialView(所有这些对用户来说都是透明的,因为它们发生在后台) 因此,当加载表单时,站点会自动提交(发布)数据(项目id和an

我有一个关于使用MVC 3提供的AntiForgeryToken的问题

我会尽力解释我的想法

其基本思想是使用Ajax按钮“标记为收藏”目录中的一个(或多个)项目。 因此,我有一个包含整个项目列表的网格,每个项目都有一个按钮作为收藏夹

嗯。。。我的想法是:

当用户按下favorite按钮时,将向服务器发送GET请求,以检索带有AntiForgeryToken的partialView(所有这些对用户来说都是透明的,因为它们发生在后台)

因此,当加载表单时,站点会自动提交(发布)数据(项目id和antiforgerytoken)以将此项目标记为收藏夹(同样……这发生在后台,因此用户不会看到任何东西)

这就是Firebug的请求/响应的想法:

GET http://localhost/User/Favorite/Mark?url=156

Response from GET:

<form action="/User/Favorite/Mark?url=156" method="post">
<input name="__RequestVerificationToken" type="hidden" value="WVXhVJJ3VNB8HrZQ6CZBPt35z2zvDjaHmlYWrnCvJoDUgeWMEGUGwm3clCD27vFAsxbs0upiRdVdo9Wsus Z7B6SU NQgV3iSYTUtE/EREWqT1Is/kwNZpdNf/3Pi7fD572pO89lTdYEjL0OlzmPJ5tmRQEUq/oMbuj0MnmPZskykGz6HzRmgC4Ez2bBoCp4" />
</form>

-----------------------------

Then Submit the form with the AntiForgeryToken:

POST http://localhost/User/Favorite/Mark?url=156

__RequestVerificationToke...    WVXhVJJ3VNB8HrZQ6CZBPt35z2zvDjaHmlYWrnCvJoDUgeWMEGUGwm3clCD27vFAsxbs0upiRdVdo9Wsus Z7B6SU NQgV3iSYTUtE/EREWqT1Is/kwNZpdNf/3Pi7fD572pO89lTdYEjL0OlzmPJ5tmRQEUq/oMbuj0MnmPZskykGz6HzRmgC4Ez2bBoCp4
GEThttp://localhost/User/Favorite/Mark?url=156
GET的响应:
-----------------------------
然后提交带有AntiForgeryToken的表格:
邮递http://localhost/User/Favorite/Mark?url=156
__RequestVerificationToke。。。WVxHVJJ3VNB8HRZQ6CZBPT35Z2ZVTJAHMLYWRNCVJDUGEWMEGUGWM3CLCD27VFASXBS0UPIRDVDO9WSUS Z7B6SU NQgV3iSYTUtE/EREWqT1Is/kwNZpdNf/3PI7FD572PO89LTDYEL0OLZMPJ5TMRQEUQ/OMBUJ0MNMPZKKG6HZRMGC4EZ2BBOC4
我的问题很简单。这是一个为Ajax请求获取AntiForgeryToken的好做法?还是一个坏主意

我有这个问题,因为我不知道这个想法是否会在我的网站上造成漏洞,在这个特定的行动中加以利用


谢谢

当用户点击“收藏夹”并使用页面中已有的反伪造令牌时,为什么不向服务器发送请求(使用AJAX)?你的方法毫无必要地过于复杂


有关如何将令牌获取到Ajax请求中的信息,请参阅和相关链接。

我没有在获取请求中更改任何状态。1) 请求包含带有AntiForgeryToken的表单的PartialView 2)发送带有token的表单以在服务器上进行更改。是的,我知道这是一种复杂的方法。但是网格是由Ajax加载的,因此标记为收藏夹的按钮与获取表单然后提交表单的路径并不相似。重新加载网格时,我没有antiForgeryToken。感谢链接的示例中,
$token=$('input[name=”“\uu RequestVerificationToken”“]).val()
在页面加载时查找页面上的令牌,并将其存储在任何javascript代码都可以访问并在请求中使用的位置。你有令牌,我试着理解你的方法。。。但我很困惑。当视图完全加载时,网格中会充满一个Ajax JSON请求。因此,我目前没有生成任何antiForgeryToken。你是想告诉我我只需要在视图中创建一个AntiForgeryToken,然后在每个收藏夹请求上使用它吗?这就是为什么我不理解你的想法。AntiForgeryToken的概念是在每个表单上创建一个具有不同值的“AntiForgeryToken输入”。对吗?谢谢您的时间。您只需要在页面上的某个地方使用一个令牌,看看您可以在页面上不使用表单的情况下使用AJAX,它不必是每个表单一个令牌,它不是“一次性”令牌。