2012-04-01 4 views
21

क्या एएसपी.नेट एमवीसी 4 फॉर्म डिफ़ॉल्ट रूप से सीएसआरएफ के खिलाफ सुरक्षित हैं सुनिश्चित करने का कोई तरीका है?एएसपी.नेट एमवीसी 4 में डिफ़ॉल्ट रूप से सीएसआरएफ के खिलाफ कैसे रक्षा करें?

उदाहरण के लिए, एंटीफॉर्गेरी टोकन स्वचालित रूप से दोनों दृश्यों और नियंत्रक कार्यों में सभी रूपों पर लागू होने का कोई तरीका है?

इस प्रश्न पर पृष्ठभूमि: Prevent Cross-Site Request Forgery (CSRF) using ASP.NET MVC’s AntiForgeryToken() helper और Anatomy of a Cross-site Request Forgery Attack

+0

मुझे संदेह है कि यह केवल उन फॉर्मों पर आवश्यक है जो प्रवेश फॉर्म प्रदान करते हैं, जैसे लॉग इन फॉर्म या उपयोगकर्ता अधिकार प्रशासनिक रूप, या फॉर्म जो व्यक्तिगत रूप से पहचाने जाने योग्य जानकारी जैसे कि सामाजिक सुरक्षा संख्याएं और पास वाक्यांश सबमिट करते हैं। लेकिन मैं जवाब देखने के लिए तत्पर हूं। –

+4

चूंकि सीएसआरएफ किसी को भी आपके क्रेडेंशियल्स के तहत किसी वेब एप्लिकेशन पर किसी भी क्रिया को निष्पादित करने की अनुमति दे सकता है, ऐसा लगता है कि डेटा में प्रवेश करने या संशोधित करने वाले सभी कार्यों को इसके खिलाफ सुरक्षित किया जाना चाहिए। उदाहरण के लिए, एकाउंटिंग एप्लिकेशन में एक रिकॉर्ड जोड़ना। –

+1

वे, निश्चित रूप से, पहले आपके प्रमाण पत्र की आवश्यकता होगी। :) –

उत्तर

22

osoviejo उत्तम जवाब देने के लिए नीचे दिए गए निर्देशों मेरी हाल ही में blog post on CSRF से जोड़ने के लिए, अपने काम को एक साथ रखा में जानकारी के साथ एक व्यापक जवाब में फिल का ब्लॉग।

एएसपी.नेट/एमवीसी इसके लिए एक तंत्र प्रदान करता है: आप वैश्विक FilterProviders ऑब्जेक्ट पर फ़िल्टर के संग्रह में जोड़ सकते हैं। यह आपको कुछ सुरक्षा नियंत्रकों को लक्षित करने की अनुमति देता है, न कि दूसरों को, आवश्यक सुरक्षा सुविधा जोड़ना।

सबसे पहले, हमें एक IFilterProvider को लागू करने की आवश्यकता है। नीचे, आप फिल हैक की Conditional Filter Provider कक्षा पा सकते हैं। इस परियोजना को अपनी परियोजना में जोड़कर शुरू करें।

public class ConditionalFilterProvider : IFilterProvider 
{ 
    private readonly 
     IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions; 

    public ConditionalFilterProvider(
     IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions) 
    { 
     _conditions = conditions; 
    } 

    public IEnumerable<Filter> GetFilters(
     ControllerContext controllerContext, 
     ActionDescriptor actionDescriptor) 
    { 
     return from condition in _conditions 
       select condition(controllerContext, actionDescriptor) into filter 
       where filter != null 
       select new Filter(filter, FilterScope.Global, null); 
    } 
} 

फिर, Application_Start कि वैश्विक FilterProviders संग्रह सुनिश्चित करता है कि सभी पोस्ट नियंत्रक तरीकों AntiForgeryToken की आवश्यकता होगी के लिए एक नया ConditionalFilterProvider कहते हैं करने के लिए कोड जोड़ें।

IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions = 
    new Func<ControllerContext, ActionDescriptor, object>[] { 
    // Ensure all POST actions are automatically 
    // decorated with the ValidateAntiForgeryTokenAttribute. 

    (c, a) => string.Equals(c.HttpContext.Request.HttpMethod, "POST", 
    StringComparison.OrdinalIgnoreCase) ? 
    new ValidateAntiForgeryTokenAttribute() : null 
}; 

var provider = new ConditionalFilterProvider(conditions); 

// This line adds the filter we created above 
FilterProviders.Providers.Add(provider); 

आप ऊपर दो कोड लागू करते हैं तो आपके MVC आवेदन साइट के लिए हर पोस्ट के लिए AntiForgeryToken से हो जाएगा। आप फिल हैक के CSRF example web site पर इसे आज़मा सकते हैं - एक बार संरक्षित होने पर, सीएसआरएफ हमला को [ValidateAntiForgeryToken] एनोटेशन जोड़ने के बिना फेंक देगा। यह "भूलने वाले प्रोग्रामर" से संबंधित कमजोरियों के पूरे मेजबान का नियम है।

+0

क्या यह दृष्टिकोण AJAX पोस्ट के साथ काम करेगा? – Vincent

+0

हां, मुझे विश्वास है। –

+0

यह प्रश्न एमवीसी 4 के लिए विशिष्ट है लेकिन मुझे लगता है कि यह पुराने संस्करणों जैसे 3 में भी काम कर सकता है, क्या यह सच है? – evanmcdonnal

0

एक तरह से करने के लिए यह उन्हें स्वचालित रूप से यह कोड डालना के लिए ASP.NET MVC में टी -4 टेम्पलेट्स कि रूपों बनाने के संशोधित करने के लिए, होगा:

<% using(Html.Form("UserProfile", "SubmitUpdate")) { %> 
    <%= Html.AntiForgeryToken() %> 
    <!-- rest of form goes here --> 
<% } %> 

और निश्चित रूप से, आप पर इसी विशेषता की जरूरत है नियंत्रक विधि:

[ValidateAntiForgeryToken] 
public ViewResult SubmitUpdate() 
{ 
    // ... etc 
} 

यह वास्तव में नहीं है कि मुश्किल इस तरह से एक आवेदन पुनः स्थापित करने के लिए है, जब तक यह असामान्य रूप से बड़े हैं। एमवीसी में मैंने जो आखिरी आवेदन लिखा था, वह शायद मुझे दोबारा दोबारा लेने के लिए ले जाएगा।

+0

रॉबर्ट, इस नमूना कोड के लिए धन्यवाद। ये उपयोगी है। लेकिन मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या यह स्वचालित रूप से सभी रूपों और सभी नियंत्रक कार्यों पर एक कंबल के रूप में लागू करने का तरीका है। उदाहरण के लिए, नियंत्रक विधि में विशेषता जोड़ने के लिए भूलने की संभावना को रोकने के लिए। –

2

मैंने दो कोड विश्लेषण नियमों को लिखने के लिए FXCop का उपयोग किया है, जिसके लिए एक HttpMethod विशेषता सभी नियंत्रक क्रियाओं पर लागू होती है और एक सेकंड जिसके लिए HttpPost विशेषता वाले किसी भी क्रिया की आवश्यकता होती है, उसके लिए एक आवश्यक एन्टीफॉर्गेरी टोकन विशेषता भी होनी चाहिए।

यह हमारे लिए अच्छा काम करता है। नियम

11

लिखने के लिए विशेष रूप से कठिन नहीं हैं आप एक फ़िल्टर प्रदाता का उपयोग किसी शर्त के साथ कर सकते हैं कि फिल्टर ValidateAntiForgeryTokenAttribute() को HttpContext.Request.HttpMethod == "POST" पर लागू किया जा सकता है।

मैं अनिवार्य रूप से सामान्य दृष्टिकोण described by Phil Haack पीछा किया, और उचित हालत कहा:

// Ensure all POST actions are automatically decorated with the ValidateAntiForgeryTokenAttribute. 
(c, a) => string.Equals(c.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase) ? 
new ValidateAntiForgeryTokenAttribute() : null 
+0

यह एक अच्छा दृष्टिकोण की तरह लगता है। धन्यवाद। –

+1

मैंने इस जवाब को सीएसआरएफ और एएसपी.नेट/एमवीसी के बारे में हालिया पोस्ट में फिल के ब्लॉग पोस्ट से सशर्तफिल्टरप्रोवाइडर के बारे में जानकारी के साथ संयुक्त किया है। http://kylehodgson.com/2013/01/08/asp-netmvc-web-security-basics-csrf/ –

संबंधित मुद्दे