2011-06-13 9 views
5

मेरे previous question के बाद एएसपीनेट का डिफ़ॉल्ट पृष्ठ क्या है। आईएसपोस्टबैक कार्यान्वयन सुरक्षित है (यह नहीं है; इसे फिक्र किया जा सकता है ... HTTP क्रिया को पोस्ट भी नहीं होना चाहिए!), मैं सोच रहा था; निश्चित रूप से इसे लागू करने के लिए एक बेहतर तरीका होना चाहिए? क्या हम एक पेज के साथ आ सकते हैं। आईएसपोस्टबैक कार्यान्वयन, जब यह सच है, यह इंगित करने के लिए लगभग गारंटी है कि पृष्ठ एक वास्तविक एएसपीनेट पोस्टबैक है? यह महत्वपूर्ण है कि कोई व्यक्ति केवल एक बार सुरक्षा जांच करना चाहता है (जैसे उपयोगकर्ता की भूमिका के आधार पर कुछ सामग्री दिखाई दे रही है), और यह केवल तभी करना चाहती है जब हम एएसपीनेट पोस्टबैक से निपट नहीं रहे हों ।पेज.इसपोस्टबैक का एक सुरक्षित कार्यान्वयन?

ऐसा करने के तरीके के रूप में मेरा पहला विचार एक संपत्ति में जाँच कोड लागू करने के लिए कर रहे हैं, इसलिए मैं Page_Load अंदर कुछ इस तरह लिख सकते हैं:

if (!_isPostBack) 
{ 
    // Do security check 
    if (userIsNotAuthorized) 
    { 
     btnViewReports.Visible = false; 
     btnEditDetails.Visible = false; 
     // etc. 
    } 
} 

वहाँ एक रास्ता सुरक्षित रूप से _isPostBack लागू करने के लिए है? संभवतः व्यूस्टेट में कुछ संग्रहीत करना जो नकली नकली करने के लिए जेरी-रिग के लिए कठिन या असंभव होगा? एक यादृच्छिक स्ट्रिंग?

+3

आप के बारे में सुरक्षा के संदर्भ में "लगभग गारंटी" पूछ रहे हैं? इसका कोई अर्थ नही बन रहा है। यह या तो सुरक्षित है, या यह नहीं है। के रूप में अच्छी तरह से – jalf

+1

सुरक्षित नहीं, मेरा मतलब है कि संदर्भ RSA एन्क्रिप्शन लगभग सुरक्षित 'है में लगभग गारंटी' "लगभग" एक ही है; सैद्धांतिक रूप से यह क्रूर-मजबूर हो सकता है या आप 'भाग्य' कर सकते हैं और किसी की कुंजी का अनुमान लगा सकते हैं, लेकिन यह अविश्वसनीय रूप से असंभव या मुश्किल है। – Jez

+0

क्लाइंट से आने वाले _anything_ पर भरोसा करने का कोई तरीका नहीं है। बस अपने तर्क को फिर से काम करें, आपके पास सत्र वस्तु है। –

उत्तर

1

ठीक है, मुझे लगता है कि समाधान क्या है: पेज। आईएसपोस्टबैक पहले से ही सुरक्षित है, जब तक कि ईवेंट सत्यापन सक्षम हो। मुझे नीचे अपने तर्क की व्याख्या करने दें और अगर मुझे कुछ गड़बड़ हो गई है तो मुझे कोई टिप्पणी जोड़ने में खुशी होगी।

एएसपीनेट पर एक स्पूफ पोस्टबैक पोस्ट करने के लिए और इवेंट सत्यापन सक्षम होने के साथ नियंत्रण के OnClick ईवेंट को ट्रिगर करने के लिए, क्लाइंट को __EVENTVALIDATION फॉर्म फ़ील्ड भेजना होगा। इस फ़ील्ड में एक विशिष्ट रूप से जेनरेट की गई स्ट्रिंग है जो मूल रूप से ASP.net को बताती है जो उस पृष्ठ के लिए पोस्टबैक ईवेंट को नियंत्रित करती है। यदि आप उस बटन के लिए पोस्टबैक को धोखा देने का प्रयास करते हैं जिस पर .Visibility = false सेट है, तो आपको एक ईवेंट सत्यापन त्रुटि संदेश दिखाई देगा। तो, ऐसा लगता है कि आप छिपे हुए नियंत्रण पर क्लिक को सीधे खराब नहीं कर सकते हैं।

क्या है कि आप गाया कर दिया गया है पृष्ठ पर मौजूदा बटनों में से एक की एक पोस्टबैक स्पूफिंग के बारे में (यानी। आप देखना/उस पर क्लिक करें अनुमति होती हैं)? खैर, आप पृष्ठ पर पोस्टबैक भेज सकते हैं, लेकिन आपको एक वैध __VIEWSTATE सबमिट करना होगा या आपको केवल 'राज्य जानकारी अमान्य' त्रुटि मिल जाएगी। वैध __VIEWSTATE मान्य करने के लिए, आपको पहले से ही पृष्ठ को गैर-पोस्टबैक के रूप में लोड करने की आवश्यकता है, है ना? इसका मतलब है कि __VIEWSTATE में उचित नियंत्रण और रिकॉर्डिंग को छिपाने, सुरक्षा-जांच कोड कम से कम एक बार निष्पादित किया जाएगा। इसलिए, जब आप हंसोड़ पोस्टबैक पोस्ट, हाँ यह Page.IsPostBack कारण सच होना होगा, लेकिन यह कोई फर्क नहीं पड़ता क्योंकि प्रस्तुत __VIEWSTATE पहले से ही सामग्री को छिपाने के लिए पिछले गैर पोस्टबैक पृष्ठ लोड पर उत्पन्न हो रही हैं कि आप नहीं करना चाहिए यदि आप एक पोस्टबैक धोखा दे सकते हैं, लेकिन केवल एक __VIEWSTATE है कि पहले एक गैर पोस्टबैक पृष्ठ लोड द्वारा उत्पन्न की गई पारित करके की पहुंच है ... इसलिए,।

तो, क्योंकि इन तथ्यों के, यह केवल करने के लिए सुरक्षित एक Page.IsPostBack == false ब्लॉक के अंदर सुरक्षा की जाँच कोड डाल होना चाहिए। ASP.net सर्वर पर वैध पोस्टबैक सबमिट किए जाने से पहले इसे हमेशा एक बार चलाना चाहिए। या क्या मैं कुछ न कुछ भूल रहा हूं?

0

एक कुकी आपकी आवश्यकताओं के लिए एक बेहतर प्रणाली है। कुकी एक टोकन है जो केवल हाल ही में हस्ताक्षरित होने और कुछ अनुमतियों और/या प्राथमिकताओं के लिए टोकन के धारकों के धारक के लिए सर्वर और वाउच द्वारा उत्पन्न की जा सकती है। इनमें से कुछ विशेषताएं फॉर्म प्रमाणीकरण में बनाई गई हैं। आप अपनी कुकी तंत्र को कार्यान्वित कर सकते हैं, लेकिन आपको सुरक्षित कुकी प्रोटोकॉल का शोध करना चाहिए क्योंकि कई गैर-स्पष्ट सुरक्षा विचार हैं।

लाभ यह है कि आपको प्रत्येक अनुरोध पर डेटाबेस में जाना नहीं है, आपको बस विश्वास है। यह कुछ डीओएस हमलों के मौसम के लिए भी एक अच्छी रणनीति हो सकती है क्योंकि आप अपने ऐप को स्तरीय कर सकते हैं जैसे कि आपके ऐप सर्वर के सामने एक समर्पित डिवाइस भी टोकन को मान्य करता है और अमान्य अनुरोधों को फेंक देता है।

यदि कुकीज़ की अनुमति नहीं है, तो आप यूआरएल के हिस्से के रूप में टोकन भेज सकते हैं, जैसा फॉर्मूथ अनुमति देता है, या आपके पोस्टबैक में एक फॉर्म फ़ील्ड के रूप में। लेकिन एक बार जब आप एक उचित टोकन उत्पन्न करने की परेशानी से गुज़र चुके हैं, तो कुकीज़, आईएमएचओ को प्रबंधित करने के लिए यह और अधिक काम है।

+0

तो एएसपीनेट में, चीजों का उपयोग करने का सबसे अच्छा तरीका सत्र का उपयोग करना है? वैसे भी कुकी का एएसपीनेट प्रतिनिधित्व है। – Jez

+0

[कोवाक्स एट अल। एक सुरक्षित कुकी प्रोटोकॉल में] (http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf) आपकी समस्या का एक उचित रूप में ठोस सामान्य दृष्टिकोण का परिचय। मुझे नहीं पता कि एएसपी.Net फॉर्म्स के पास इन लाभ हैं, लेकिन मैंने कुछ साल पहले सी # में अपने सटीक प्रोटोकॉल को सफलतापूर्वक कार्यान्वित किया था (बिना नेट क्रिप्टो लाइब्रेरीज़ का उपयोग करके) बहुत अधिक परेशानी के बिना। यह मेरे लिए एक मजेदार और पहुंच योग्य परियोजना थी और पूरा करने के लिए संतोषजनक था। मुझे नहीं पता कि उनके काम पर कोई प्रासंगिक आलोचना या सुधार हुआ है या नहीं। –

2

मेरे पास कुछ साल पहले एक परियोजना थी जहां हमारे पास कोड पर कुछ प्रवेश परीक्षण किया गया था। उन्होंने इस तथ्य को ध्वजांकित किया कि डिफ़ॉल्ट रूप से IsPostback http क्रिया की जांच नहीं करता है। इसके समाधान के लिए मुझे लगता है कि डिफ़ॉल्ट implmentation छाया IsPostback की अपनी 'खुद कार्यान्वयन के साथ एक सार पृष्ठ श्रेणी का निर्माण:

Public Class ProjectPage : System.Web.UI.Page 

    public new bool IsPostBack() 
    { 
     return (Page.IsPostBack && Request.HttpMethod.ToUpper() == "POST"); 
    } 

End Class 

यह आप http क्रिया पर परीक्षण करने की अनुमति देता है, लेकिन आप आसानी से अन्य करने के लिए विधि का विस्तार कर सकता है चेक भी।