【问题标题】:Is a good practice to avoid CSRF doing this? (ASP.NET MVC 3)避免 CSRF 这样做是一个好习惯吗? (ASP.NET MVC 3)
【发布时间】:2013-01-30 21:22:20
【问题描述】:

我有一个关于使用 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 的好习惯吗?还是个坏主意?

我有这个问题是因为我不知道这个想法是否可以在我的网站上制造一个漏洞来利用这个特定的操作。

谢谢

【问题讨论】:

    标签: asp.net-mvc csrf antiforgerytoken


    【解决方案1】:

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

    请参阅Problems implementing ValidatingAntiForgeryToken attribute for Web API with MVC 4 RC 和相关链接,了解如何将令牌放入您的 Ajax 请求中。

    【讨论】:

    • 我没有通过 GET 请求更改任何状态。 1) 使用 AntiForgeryToken 请求包含表单的 PartialView 2) 发送带有令牌的表单以在服务器上进行更改。
    • 是的,我知道这是一种复杂的方法。但是网格是由 Ajax 加载的,所以标记为收藏的按钮并不像一个获取表单然后提交的路由。重新/加载网格时,我没有 antiForgeryToken。谢谢
    • 在链接的示例中,$token = $('input[name=""__RequestVerificationToken""]').val(); 在页面加载时找到页面上的令牌并将其存储在任何 javascript 代码可以访问它并在请求中使用它的位置。你确实拥有令牌。
    • 我试图理解你的方法......但我很困惑。当视图完全加载时,网格会被 Ajax JSON 请求填充。所以,我目前没有生成任何 antiForgeryToken。你是想告诉我我只需要在视图中创建一个 AntiForgeryToken 然后在每个喜欢的请求上使用它?这就是为什么我不明白你的想法。 AntiForgeryToken 的概念是在每个表单上创建一个具有不同值的“AntiForgeryToken 输入”。对?感谢您的宝贵时间。
    • 您只需要页面上的 somewhere 令牌,请参阅stackoverflow.com/questions/4074199/… 您可以在页面上使用 NO 表单进行 AJAX,不必每个表单一个,它不是“一次性”令牌。
    猜你喜欢
    • 2011-07-13
    • 2010-09-11
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2010-12-02
    • 2014-08-11
    • 2014-07-21
    • 2010-11-12
    相关资源
    最近更新 更多