asp.net-mvc
Html.AntiForgeryToken
खोज…
परिचय
एंटी-फर्जी टोकन का उपयोग क्रॉस-साइट अनुरोध जालसाजी के खिलाफ आपके आवेदन की सुरक्षा में मदद करने के लिए किया जा सकता है। इस सुविधा का उपयोग करने के लिए, एंटीफॉर्गीटोकन विधि को एक फॉर्म से कॉल करें और उस वेलिडेटएनेटीफॉरगेरीटॉकेन एट्रिब्यूट विशेषता को उस एक्शन विधि में जोड़ें जिसे आप सुरक्षित करना चाहते हैं।
एक छुपा प्रपत्र फ़ील्ड (एंटी-जालसाजी टोकन) उत्पन्न करता है जो फ़ॉर्म सबमिट किए जाने पर मान्य होता है।
वाक्य - विन्यास
- @ Html.AntiForgeryToken ()
टिप्पणियों
CSRF टोकन ( __RequestVerificationToken
) के साथ एक अजाक्स अनुरोध प्रस्तुत करते समय सुनिश्चित करें कि सामग्री प्रकार application/json
लिए सेट नहीं है। यदि आप jQuery का उपयोग कर रहे हैं, तो यह स्वचालित रूप से application/x-www-form-urlencoded
में सामग्री प्रकार सेट करता है जिसे ASP.NET MVC द्वारा मान्यता प्राप्त है।
सावधान
यह मान सेट करते समय सावधानी बरतें। अनुचित तरीके से इसका उपयोग करने से एप्लिकेशन में सुरक्षा कमजोरियां खुल सकती हैं।
मूल उपयोग
@Html.AntiForgeryToken()
सहायक विधि क्रॉस-साइट अनुरोध जालसाजी (या CSRF) हमलों से बचाता है।
यह केवल आपके मौजूदा रूपों में से एक के भीतर Html.AntiForgeryToken()
सहायक का उपयोग करके और इसके संबंधित कंट्रोलर एक्शन को सजाने के लिए [ValidateAntiForgeryToken]
विशेषता के साथ उपयोग किया जा सकता है।
रेज़र (YourView.cshtml)
@using (Html.BeginForm("Manage", "Account")) {
@Html.AntiForgeryToken()
<!-- ... -->
}
या
<form>
@Html.AntiForgeryToken()
<!-- ... -->
</form>
नियंत्रक (YourController.cs)
लक्ष्य क्रिया विधि:
[ValidateAntiForgeryToken]
[HttpPost]
public ActionResult ActionMethod(ModelObject model)
{
// ...
}
पहचान पहचानने योग्य जाँच अक्षम करें
अक्सर बार आपको एक अपवाद दिखाई देगा
Anti forgery token is meant for user "" but the current user is "username"
ऐसा इसलिए है क्योंकि एंटी-फ़ॉगररी टोकन वर्तमान लॉग-इन उपयोगकर्ता से भी जुड़ा हुआ है। यह त्रुटि तब दिखाई देती है जब कोई उपयोगकर्ता लॉग इन करता है, लेकिन उनका टोकन अभी भी साइट के लिए अनाम उपयोगकर्ता होने से जुड़ा हुआ है।
इस व्यवहार को ठीक करने के कुछ तरीके हैं, लेकिन यदि आप CSRF टोकन को लॉग-इन की स्थिति में किसी उपयोगकर्ता के लिंक से लिंक नहीं करेंगे, तो आप इस सुविधा को अक्षम कर सकते हैं।
इस लाइन को अपने Global.asax
फ़ाइल या इसी तरह के एप्लिकेशन स्टार्टअप लॉजिक में रखें।
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true;
सभी पदों का सत्यापन
CSRF के कारण होने वाली भेद्यता के कारण, आमतौर पर सभी HttpPosts पर एक एंटीफॉर्गीटॉकेन की जांच करना एक अच्छा अभ्यास माना जाता है जब तक कि ऐसा न करने का एक अच्छा कारण है (पोस्ट के साथ कुछ तकनीकी समस्या, एक और प्रमाणीकरण तंत्र और / या है) पोस्ट एक डीबी या फ़ाइल में सहेजने जैसी स्थिति को म्यूट नहीं करता है)। यह सुनिश्चित करने के लिए कि आप भूल नहीं करते हैं, आप एक विशेष GlobalActionFilter जोड़ सकते हैं जो स्वचालित रूप से सभी HttpPosts की जांच करता है जब तक कि कार्रवाई को एक विशेष "अनदेखा" विशेषता से सजाया गया हो।
[AttributeUsage(AttributeTargets.Class)]
public class ValidateAntiForgeryTokenOnAllPosts : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var request = filterContext.HttpContext.Request;
// Only validate POSTs
if (request.HttpMethod == WebRequestMethods.Http.Post)
{
bool skipCheck = filterContext.ActionDescriptor.IsDefined(typeof(DontCheckForAntiForgeryTokenAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(DontCheckForAntiForgeryTokenAttribute), true);
if (skipCheck)
return;
// Ajax POSTs and normal form posts have to be treated differently when it comes
// to validating the AntiForgeryToken
if (request.IsAjaxRequest())
{
var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
var cookieValue = antiForgeryCookie != null
? antiForgeryCookie.Value
: null;
AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);
}
else
{
new ValidateAntiForgeryTokenAttribute()
.OnAuthorization(filterContext);
}
}
}
}
/// <summary>
/// this should ONLY be used on POSTS that DO NOT MUTATE STATE
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class DontCheckForAntiForgeryTokenAttribute : Attribute { }
यह सुनिश्चित करने के लिए कि यह सभी अनुरोधों पर जांचा जाता है, बस इसे अपने ग्लोबल एक्शन फिल्टर्स में जोड़ें
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//...
filters.Add(new ValidateAntiForgeryTokenOnAllPosts());
//...
}
}
अग्रिम उपयोग: हर पोस्ट के लिए डिफ़ॉल्ट एंटीफॉगररी फ़िल्टर लागू करें
हम प्रत्येक POST
अनुरोध के लिए Antiforgery attribute
लागू करना भूल सकते हैं, इसलिए हमें इसे डिफ़ॉल्ट रूप से बनाना चाहिए। यह नमूना सुनिश्चित करेगा कि Antiforgery filter
हमेशा हर POST
अनुरोध पर लागू किया जाएगा।
सबसे पहले नया AntiForgeryTokenFilter
फिल्टर बनाएं:
//This will add ValidateAntiForgeryToken Attribute to all HttpPost action methods
public class AntiForgeryTokenFilter : IFilterProvider
{
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
List<Filter> result = new List<Filter>();
string incomingVerb = controllerContext.HttpContext.Request.HttpMethod;
if (String.Equals(incomingVerb, "POST", StringComparison.OrdinalIgnoreCase))
{
result.Add(new Filter(new ValidateAntiForgeryTokenAttribute(), FilterScope.Global, null));
}
return result;
}
}
फिर इस कस्टम फ़िल्टर को MVC, Application_Start में पंजीकृत करें:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//Cactch generic error
filters.Add(new HandleErrorAttribute());
//Anti forgery token hack for every post request
FilterProviders.Providers.Add(new AntiForgeryTokenFilter());
}
}
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
इसलिए अब आपके सभी POST
अनुरोधों को एंटीफ़ॉर्जरी विशेषताओं का उपयोग करके डिफ़ॉल्ट रूप से संरक्षित किया जाता है, इसलिए अब हमें प्रत्येक POST पद्धति पर [ValidateAntiForgeryToken]
विशेषता रखने की आवश्यकता नहीं है।
Jquery अजाक्स अनुरोध के साथ AntiForgeryToken का उपयोग करना
सबसे पहले आप फॉर्म बनाएं
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
}
क्रिया विधि
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Test(FormViewModel formData)
{
// ...
}
लिपि
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script>
var formData = new FormData($('form')[0]);
$.ajax({
method: "POST",
url: "/demo/test",
data: formData ,
success: function (data) {
console.log(data);
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(errorThrown);
}
})
</script>
सुनिश्चित करें कि कन्टैंट टाइप application/x-www-form-urlencoded
अलावा किसी भी चीज़ पर सेट नहीं है और यदि इसके द्वारा निर्दिष्ट Jquery डिफॉल्ट में application/x-www-form-urlencoded
निर्दिष्ट नहीं है