2009-04-13 4 views
21

ASP.NET MVC (डिफ़ॉल्ट रूटिंग), मैं इस तरह का URL उपयोग करने के लिए एक फार्म के साथ एक दृश्य पर लौटने के लिए एक ग्राहक संपादित करना चाहते हैं में:,एएसपी.नेट एमवीसी में छिपे हुए फॉर्म फ़ील्ड से कहीं ज्यादा सुरक्षित?

/Customers/Edit/5 

मैं CustomerId=5 के उपयोग करने की जरूरत है, लेकिन मैं अब it.Right बदलने के लिए मैं आईडी छिपा का उपयोग कर एक ग्राहक की अनुमति के लिए नहीं करना चाहती:

<%= Html.Hidden("CustomerId") %> 

यह सिद्ध है कि मैं क्या चाहता हूँ, लेकिन मैं धारणा के तहत हूं कि छिपा प्रपत्र चर सुरक्षित नहीं हैं और अंतिम उपयोगकर्ता द्वारा छेड़छाड़ की जा सकती है।

तो, ग्राहक को उनकी जानकारी संपादित करने की अनुमति देने का सर्वोत्तम तरीका क्या है, लेकिन उनकी आईडी नहीं?

उत्तर

12

मेरे समाधान के अनुसार एन्क्रिप्ट सकता Steven Sanderson's ASP.NET MVC book से छेड़छाड़ प्रूफिंग कोड का इस्तेमाल किया गया। विचार यह है कि क्या आप सबूत छेड़छाड़ करना चाहते हैं किसी भी गुप्त फ़ॉर्म क्षेत्र के हैश बनाने है:

<%= Html.Hidden("CustomerId") %> 
<%= Html.Hidden("CustomerIdHash") %> 

जब फ़ॉर्म सबमिट स्टीवन के कोड तो ग्राहक आईडी का एक और हैश की गणना करता है और कुछ बनाता है यह CustomerIdHash बराबर होती है। यदि ऐसा होता है, तो कोई छेड़छाड़ नहीं हुई है। यह बहुत अच्छा कोड है, और किताब की कीमत के लायक है।

+4

सुनिश्चित करें कि आप हैश को नमक, अन्यथा आपने कुछ हासिल नहीं किया है! (मुझे विश्वास है कि पुस्तक इसे और विस्तार से बताती है।) – teedyay

+0

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

6

आप ब्राउज़र पक्ष पर कोई वास्तविक सुरक्षा नहीं करते हैं। आप क्वेरी स्ट्रिंग में ग्राहक आईडी डाल सकते हैं, लेकिन सर्वर को यह सत्यापित करना चाहिए कि उन्हें उस ग्राहक को संपादित करने की अनुमति है या नहीं। यदि नहीं, तो एक त्रुटि लौटाएं।

10

आपके द्वारा देखे गए दृश्य को प्रदर्शित करने से पहले अपने नियंत्रक कार्रवाई (/ ग्राहक/संपादन) में अनुमतियां जांचें। ध्यान दें कि यहां समस्या आपके छिपे हुए फ़ील्ड के साथ नहीं है: उपयोगकर्ता अपने ब्राउज़र में बस "http://yoursite.com/Customers/Edit/10" टाइप कर सकता है। इसलिए आपको अपनी कार्रवाई में जांच करनी है कि उपयोगकर्ता को वास्तव में अनुरोध किए गए ग्राहक के विवरणों को संपादित करने की अनुमति है या नहीं, इससे कोई फर्क नहीं पड़ता कि उसने कार्रवाई कैसे की।

+1

मैं देखता हूं कि नियंत्रक कार्रवाई को कॉन्फ़िगर कैसे करें ताकि केवल अधिकृत उपयोगकर्ता किसी विशेष आईडी के लिए दृश्य देख सकें, लेकिन मुझे नहीं लगता कि उपयोगकर्ता को उस आईडी को बदलने से कैसे रोकें। उदाहरण के लिए, उपयोगकर्ता को/ग्राहक/संपादन/10 देखने के लिए अधिकृत किया जा सकता है, लेकिन फिर वे फॉर्म सबमिट करते समय आईडी बदल सकते हैं और एक आईडी संपादित कर सकते हैं जिसे वे पहले स्थान पर देखने के लिए अधिकृत नहीं थे (उदाहरण के लिए/ग्राहक/संपादन/1 1)। मुझे लगता है कि मुझे यह सुनिश्चित करने के लिए सबमिट किए गए फॉर्म की जांच करनी है कि आईडी मैंने उन्हें पहले स्थान पर भेजा है। – royco

+1

आपको यह जांचना होगा कि वर्तमान में लॉग इन किए गए उपयोगकर्ता को अनुरोधित आईडी देखने/संपादित करने की अनुमति है। तो आपके नियंत्रक कार्रवाई में आप उपयोगकर्ता नाम पुनर्प्राप्त करते हैं (उदाहरण के लिए Thread.CurrentPrincipal.Identity.Name का उपयोग करके) और अपने डीबी में जांचें कि क्या इस उपयोगकर्ता को ऐसा करने की अनुमति है जिसे उसने करने की कोशिश की है (अनुरोधित कार्रवाई के आधार पर देखें या संपादित करें)। इसलिए यदि उपयोगकर्ता आईडी बदलता है, तो वह अभी भी उस संपादन को नहीं देख सकता जिसे उसे अनुमति नहीं है। असल में उनके पास आईडी बदलने की कोशिश करने का कोई कारण नहीं है ... –

1

दो पहलू हैं। मुझे यकीन नहीं है कि आप सीधे किस बारे में पूछ रहे थे, लेकिन वे दोनों महत्वपूर्ण हैं:

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

मुझे एक ही समस्या है और मेरा मानना ​​है कि समाधान में सरोगेट कुंजी का उपयोग करना शामिल है। प्रत्येक तालिका में जहां मेरे पास एक आईडी कॉलम है, मैं एक कुंजी कॉलम भी जोड़ता हूं जो एक GUID (SQL सर्वर में अद्वितीय पहचानकर्ता) है। अब, जब जॉइन या कोई आंतरिक तर्क करते हैं तो मैं आईडी का उपयोग करता हूं लेकिन नियंत्रक सभी कुंजी का उपयोग करते हैं। चूंकि यह एक ग्रिड है, यह अनुमान लगाना मुश्किल है कि एक और रिकॉर्ड क्या है।

वैकल्पिक रूप से (या इसके बाद के संस्करण के अलावा) आप छिपी हुई फ़ील्ड This article

3

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

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