簡體   English   中英

用於JSON POST的ASP.Net MVC CSRF預防

[英]ASP.Net MVC CSRF Prevention for JSON POST

我想關閉通過AJAX發布原始JSON的CSRF漏洞。

我熟悉MVC使用ValidateAntiForgeryTokenAttribute@Html.AntiForgeryToken()自動化CSRF預防的機制; 但是,如果我理解正確,這種機制要求POST application/x-www-form-urlencoded Content-Type of application/x-www-form-urlencoded (或類似)。 ASP.Net MVC中是否有一個內置機制,它會拒絕使用Content-Type of application/json POST請求的CSRF? 如果沒有,我是否堅持將防偽措施放入JSON對象本身? 您是否可以推薦一種技術來保護來自CSRF漏洞的JSON POST請求,其安全性與ASP.Net MVC中內置的基於表單的方法相同?

這個問題引發了一個有趣的討論。

如果請求Content-Type是application/json ,則CSRF不是問題。 這是因為必須通過XmlHttpRequest提交application / json請求,並且作為AntiForgeryToken驗證必要部分的cookie不能跨站點傳遞,但必須遵守同源策略

但是,惡意用戶可以通過application/x-www-form-urlencoded提交請求,該請求包含看似有效的JSON請求的信息,並將任何授權cookie傳遞回您的應用程序。 http://forums.asp.net/t/1624454.aspx/1?MVC3+JSON+Model+binding+not+working+with+AntiForgeryhttp:// aspnet上有更詳細的討論。 codeplex.com/workitem/7472 ,我發布了一個概念驗證。

雖然可以在JSON請求中包含__RequestVerificationToken,但更好的防線是創建一個Attribute來驗證請求是否為application/json類型,因為提交給您的操作的任何其他請求實際上都是JSON無效,不應該處理。

我希望這個安全問題將在MVC 4中得到解決。

更新:

這是一個簡單的AuthorizeAttribute類,您可以使用它來裝飾任何期望接收JSON的操作:

public class JsonRequestAttribute : AuthorizeAttribute
{

    /*
     * 
     *   CONFIRM that this is REALLY a JSON request.
     *   This will mitigate the risk of a CSRF attack
     *   which masquerades an "application/x-www-form-urlencoded" request
     *   as a JSON request
     * 
     */

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
         if (!filterContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
         {
             // This request is masquerading as a JSON request, kill it.
             JsonResult unauthorizedResult = new JsonResult();
             unauthorizedResult.Data = "Invalid request";
             unauthorizedResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
             filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
             filterContext.Result = unauthorizedResult;
         }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM