जैसा कि अन्य उत्तरों द्वारा इंगित किया गया है, रेफरर चेक का उपयोग करके स्वयं पर्याप्त नहीं है और आपको वास्तव में एंटी-फोर्जरी टोकन का उपयोग करना चाहिए।
हालांकि, जैसा कि @jeffsix ने इंगित किया है, आप रेफरर चेक को रक्षा-इन-गहराई (डीआईडी) रणनीति के रूप में उपयोग कर सकते हैं, इसलिए एक हमलावर को सफल हमले को निष्पादित करने के लिए एकाधिक, स्वतंत्र, रक्षा को हराने की आवश्यकता होगी।
नीचे दिए गए ValidateReferrerAttribute विशेषता का उपयोग आपके एचटीपीपोस्ट एमवीसी कार्यों पर किया जा सकता है। यदि रेफरर शून्य है, तो यह कुछ भी नहीं करता है। यदि रेफरर शून्य नहीं है तो यह जांचता है कि यह निर्दिष्ट होस्ट नाम के बराबर है। जहां भी आप ValidateAntiForgeryTokenAttribute का उपयोग कर रहे हैं, आपको इसे जोड़ने की आवश्यकता है, इसलिए इसे जोड़ना बहुत आसान होगा।
/// <summary>
/// For POST requests, checks that the requests referrer is the current site. This could be used along side the ValidateAntiForgeryToken
/// Note that many clients do not send the referrer, so we do nothing in this case.
/// This attribute can be used as part of a Defence-in-Depth (DID) strategy, so an
/// attacker would need to defeat multiple, independent, defenses to execute a successful attack.
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class ValidateReferrerAttribute : FilterAttribute, IAuthorizationFilter
{
/// <summary>
/// Called when authorization is required.
/// </summary>
/// <param name="filterContext">The filter context.</param>
/// <exception cref="System.ArgumentNullException">filterContext</exception>
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if ((filterContext.HttpContext.Request.UrlReferrer != null) &&
string.Equals(filterContext.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(filterContext.HttpContext.Request.UrlReferrer.Host, filterContext.HttpContext.Request.Url.Host, StringComparison.OrdinalIgnoreCase))
{
this.HandleExternalPostRequest(filterContext);
}
}
/// <summary>
/// Handles post requests that are made from an external source.
/// By default a 403 Forbidden response is returned.
/// </summary>
/// <param name="filterContext">The filter context.</param>
/// <exception cref="System.Web.HttpException">Request not allowed.</exception>
protected virtual void HandleExternalPostRequest(AuthorizationContext filterContext)
{
throw new HttpException((int)HttpStatusCode.Forbidden, "Request not allowed.");
}
}
स्रोत
2015-04-29 10:38:09
+1: दिलचस्प दृष्टिकोण। –
लेकिन क्या यह सच है कि एंटी-जालसाजी टोकन दृष्टिकोण अधिकांश सीएसआरएफबीड हमलों को बाहर ले जाएगा, लेकिन यह उन साइटों को बंद नहीं करेगा जो आपकी साइट पर स्वत: पंजीकरण (और फिर स्पैम) उपयोगकर्ताओं को खोजना चाहते हैं। तो मैं 100% कैसे सुनिश्चित कर सकता हूं कि मेरी वेबसाइट सुरक्षित है। –
@johnG: यह एक सीएसआरएफ हमला नहीं है। स्पैमबॉट्स को रोकने के लिए, आपको जो चाहिए वह अच्छा है [कैप्चा] (http://en.wikipedia.org/wiki/CAPTCHA)। (असल में, [अस्पष्टता के माध्यम से सुरक्षा] (http://en.wikipedia.org/wiki/Security_through_obscurity) कम से कम छोटी साइटों के लिए भी बहुत अच्छी तरह से काम कर सकती है: यदि आप अपना लॉगिन फॉर्म हर किसी के लिए पर्याप्त अलग करते हैं, तो सामान्य बॉट इसे समझने में सक्षम नहीं होगा। स्पैमर को केवल अपनी साइट के लिए अपने बॉट को ट्विक करने में समय बिताना होगा, जो कि उनके लिए लागत प्रभावी नहीं है जब तक कि आप साइट वास्तव में बड़ी और लोकप्रिय न हो।) –