避免CSRF这样做是一种好习惯吗? (ASP.NET MVC 3)

时间:2013-01-30 21:22:21

标签: asp.net-mvc csrf antiforgerytoken

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

我会尝试解释我的想法。

基本思想是一个Ajax按钮,用于从目录中“标记为收藏”一个(或多个)项目。 所以我有一个包含整个项目列表的网格,每个项目都有一个按钮,可以作为最喜欢的。

嗯......我的想法是这样的:

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

因此,当表单被加载时,站点会自动提交(POST)数据(项目的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

我的问题很简单。这是为Ajax请求获取AntiForgeryToken的好习惯吗?或者是个坏主意?

我有这个问题,因为我不知道这个想法是否会在这个具体行动中在我的网站上利用漏洞。

由于

1 个答案:

答案 0 :(得分:0)

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

请参阅Problems implementing ValidatingAntiForgeryToken attribute for Web API with MVC 4 RC以及有关如何将令牌放入Ajax请求的相关链接。