[英]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+AntiForgery和http:// 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.