2011-12-01 13 views
7

पर सीधे यूआरएल पहुंच से इनकार करें मैं अपने एक्शन विधियों के लिए सीधे पहुंच से इंकार करने का कोई तरीका ढूंढने का प्रयास कर रहा हूं। असल में मैं अपने उपयोगकर्ताओं को सीधे अपने ब्राउज़र में पता बार में यूआरएल टाइप करने के बजाय नेविगेट करने के लिंक पर क्लिक करना चाहता हूं।कार्रवाई विधि

अब मुझे पता है कि अनुरोध ऑब्जेक्ट में urlreferrer की जांच करके यह किया जा सकता है लेकिन यह अविश्वसनीय और कमजोर है क्योंकि urlreferrer को आसानी से संशोधित किया जा सकता है और कुछ सुरक्षा सूट वास्तव में अनुरोध से इसे हटा देते हैं।

तो क्या आप में से कोई भी asp.net mvc3 में ऐसा करने का तरीका जानता है?

+0

कैसे "सुरक्षित" के लिए? क्या आप सिर्फ उपयोगकर्ताओं को बुकमार्क करने और/या यूआरएल टाइप करने में सक्षम होने से रोकना चाहते हैं? या क्या आप वास्तव में उन लोगों के खिलाफ सुरक्षित बनाना चाहते हैं जो वास्तव में जावास्क्रिप्ट और कुकीज़ को धोखा देने के बारे में जानते हैं? –

+0

मैं इसे यथासंभव सुरक्षित बनाना चाहता हूं, यही कारण है कि urlreferrer वास्तव में उपयुक्त नहीं है क्योंकि इसे आसानी से खराब किया जा सकता है – Duy

+0

क्या यह सीएसआरएफ को रोकने के लिए है? या क्या आपको वास्तव में "अधिकृत" उपयोगकर्ताओं को वैध अनुरोधों को धोखा देने से रोकने की आवश्यकता है? –

उत्तर

3

मुझे यकीन नहीं कर रहा हूँ लेकिन शायद इस प्रस्ताव को मदद कर सकते हैं की सुविधा देता है लगता है कि आप इस

www.yoursite.com/home.aspx 

ठीक तरह एक यूआरएल है यार? अपने उपयोगकर्ता से बचने के लिए करने के लिए सीधे इस पेज पर भौंक आप को फिर से लिखने कर सकते हैं तो आप इस

www.yoursite.com/fdmf489ruv30/home.aspx 

तरह यूआरएल और इस यूआरएल में भाग "fdmf489ruv30" एक अद्वितीय स्ट्रिंग है कि आप session_start पर बनाया है और session_end

पर यह नष्ट कर देगा है

क्या आपको यह मिलता है या इस विचार के बारे में अधिक जानकारी चाहिए ?! आप इस तरह के यूआरएल रीराइटिंग दोस्त खोज सकते हैं।

+0

होगा यह एक अच्छा विचार है। लेकिन क्या यह उतना प्रभावी नहीं होगा यदि अद्वितीय आईडी एक क्वेरी स्ट्रिंग थी? –

+0

मैं वास्तव में ऐसा नहीं करना चाहता क्योंकि इससे यूआरएल गन्दा हो जाएगा और मित्रवत नहीं होगा। – Duy

+0

हां, एसईओ के लिए बुरा विचार है (एसईओ की अन्य अवधारणाओं द्वारा Google में बेहतर रैंक प्राप्त करने का प्रयास करें)। और क्वेरी स्ट्रिंग के बारे में, मैंने परीक्षण नहीं किया कि क्या मेरा स्वयं है और मुझे परिणाम बताएं –

0

ऐसा करने का एक त्वरित तरीका एक सत्र को सेट करना है जिसमें रीडायरेक्ट करने वाली क्रिया में एक यादृच्छिक संख्या है, यादृच्छिक संख्या को अन्य क्रिया के पैरामीटर के रूप में भी पास करें।

अन्य क्रिया (रीडायरेक्ट एक) के अंदर, कार्रवाई के पैरामीटर के साथ सत्र के मान की तुलना करें। यदि मान बराबर हैं, तो उपयोगकर्ता बटन दबाकर वहां जा रहा है, अन्यथा, यूआरएल बदलकर उपयोगकर्ता वहां जाता है। आशा करता हूँ की ये काम करेगा।

question on Stackoverflow

0

यह सुरक्षित रूप से सुनिश्चित करने के लिए एक अधिकृत उपयोगकर्ता के पास मान्य अनुरोध धोखा नहीं कर सकते असंभव है।
सब के बाद, यदि ब्राउज़र "वैध अनुरोध" बना सकता है, तो एक अधिकृत उपयोगकर्ता कर सकता है!

हालांकि, यह एक असामान्य आवश्यकता है, और मुझे यह जानने में दिलचस्पी है कि इसके पीछे प्रेरणा क्या है?

हालांकि, अनुरोध को खराब करने के लिए कठिन बनाने के कई तरीके हैं।
चूंकि कोई भी विधि पूरी तरह से सुरक्षित नहीं होगी, इसलिए आप obfuscate पर कोशिश कर सकते हैं और इसे कठिन किसी के लिए अपने अनुरोधों को खराब करने के लिए कर सकते हैं।

जैसा कि अन्य ने सुझाव दिया है, आप प्रति सत्र एक यादृच्छिक "टोकन" बना सकते हैं और इसे URL में (या तो पथ या क्वेरीस्ट्रिंग के रूप में) की आवश्यकता होती है।

इसके लिए जावास्क्रिप्ट का उपयोग करना बेहतर होगा। इस "टोकन" के साथ एक छिपी हुई इनपुट प्रस्तुत करें। फिर, प्रत्येक लिंक के click ईवेंट को अवरुद्ध करें, URL पर "टोकन" मान संलग्न करें, फिर URL पर नेविगेट करें।

आप इसका उपयोग करने से पहले अपने टोकन को किसी भी तरह से "प्रक्रिया" करने के लिए जावास्क्रिप्ट को बढ़ा सकते हैं, और अपनी जावास्क्रिप्ट को इसे खराब करने के लिए कम कर सकते हैं ... यह निश्चित रूप से उपर्युक्त उपयोगकर्ताओं को आपके यूआरएल के साथ टंकण करने से रोक देगा।

बहुत से संभावित समाधान हैं, लेकिन "दाएं" समाधान वास्तव में इस बात पर निर्भर करता है कि आप किस विशिष्ट व्यवहार को रोकने की कोशिश कर रहे हैं।

+0

इससे सहमत है। आप क्या खत्म करने की कोशिश कर रहे हैं? आप एक वैश्विक एचटीएमएल पेज कंटेनर बना सकते हैं और एजेक्स आधारित क्रियाओं का उपयोग कर सकते हैं जो एचटीएमएल लौटते हैं। अजाक्स क्रियाएं विशेषताओं या अन्य छुपे टोकन माध्यमों के माध्यम से सीधे यूआरएल पहुंच से प्रतिबंधित हो सकती हैं। – Roman

7

नीचे NoDirectAccessAttribute विधि के लिए कोड के रूप में किसी भी नियंत्रक या कार्रवाई पद्धति जहां आप डॉन 'के लिए इस प्रकार NoDirectAccess विशेषता

using System; 
using System.Web.Mvc; 
using System.Web.Routing; 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class NoDirectAccessAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.UrlReferrer == null || 
        filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host) 
      { 
      filterContext.Result = new RedirectToRouteResult(new 
          RouteValueDictionary(new { controller = "Home", action = "Index", area = "" })); 
     } 
    } 
} 

उपयोग कार्रवाई फ़िल्टर लागू होता है कि किसी भी वर्ग या कार्रवाई विधि के लिए सीधी पहुँच प्रतिबंधित करने के लिए है टी उपयोगकर्ता, सीधे ऊपर

[NoDirectAccess] 
public ActionResult IsUsernameUnique() 

यह अनुरोध करने के लिए उदाहरण में IsUsernameUnique कार्रवाई विधि के लिए किसी भी सीधी पहुंच स्वचालित रूप से घर/सूचकांक कार्रवाई विधि करने के लिए उपयोगकर्ता रीडायरेक्ट करेगा चाहते हैं।

+1

इस मुद्दे को कुछ हद तक हल किया (कुछ स्तर) – Aji

0

उपयोग Global.asax.cs में इस कोड और कॉल [NoDirectAccess] होने के लिए इस जरूरत है सभी नियंत्रकों

//Prevent direct URL access: Call [NoDirectAccess] to all controllers to block 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
    public class NoDirectAccessAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.UrlReferrer == null || 
         filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host) 
      { 
       filterContext.Result = new RedirectToRouteResult(new 
           RouteValueDictionary(new { controller = "Home", action = "Login", area = "" })); 
      } 
     } 
    } 
संबंधित मुद्दे