2010-05-11 17 views
8

हाय,क्वेरी स्ट्रिंग के छेड़छाड़ से कैसे बचें?

मेरे पास एक क्वेरी स्ट्रिंग है जैसे "http://project/page1.aspx?userID=5"। ऑपरेशन नहीं किया जाएगा, अगर 'userID' पैरामीटर मैन्युअल रूप से बदल दिया गया है। यह कैसे संभव है?

+1

बस एक तरह से स्पष्ट करने के लिए - मैं अपने परिदृश्य में अनुमान लगा रहा हूँ आप पहले से ही पृष्ठ की सेवा उपलब्ध कराई है; किसी ने कहीं और बटन पर क्लिक किया और पृष्ठ "http: //project/page1.aspx? userID = 5" पर पहुंचा। और अब इस पृष्ठ पर वे कुछ मान टाइप करने जा रहे हैं और आप नहीं चाहते हैं कि वे 7 को एड्रेस बार में 7 के लिए स्वैप करें, "सेव करें" दबाएं और अपनी वेबसाइट पर जाएं और उपयोगकर्ता की जानकारी अपडेट करें, सही बात? – Tom

उत्तर

3

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

<a href='Page1.aspx?UserID=<%= HttpUtility.UrlEncode(TamperProofStringEncode("5","F44fggjj")) %>'> 
     Click Here</a> <!--Created one anchor tag and call the function for TamperProofStringEncode--> 


    
private string TamperProofStringEncode(string value, string key) 
{ 
      System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES(); 
      System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
      mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)); 
      return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value)) + "-" + Convert.ToBase64String(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value))); 
     } 
 

'पृष्ठ 1' के पृष्ठ लोड में डिकोड एल्गोरिथ्म फोन क्वेरी स्ट्रिंग डिकोड करने के लिए

try 
     { 
      string DataString = TamperProofStringDecode(Request.QueryString["UserID"], "F44fggjj"); 
      Response.Write(DataString); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.Message); 
     } 

private string TamperProofStringDecode(string value, string key) 
    { 
     string dataValue = ""; 
     string calcHash = ""; 
     string storedHash = ""; 

     System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES(); 
     System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
     mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)); 

     try 
     { 
      dataValue = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[0])); 
      storedHash = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[1])); 
      calcHash = System.Text.Encoding.UTF8.GetString(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(dataValue))); 

      if (storedHash != calcHash) 
      { 
       //'Data was corrupted 
       throw new ArgumentException("Hash value does not match"); 
       // 'This error is immediately caught below 

      } 
     } 
     catch (Exception ex) 
     { 
      throw new ArgumentException("Invalid TamperProofString"); 
     } 

     return dataValue; 

    } 
+0

मुझे अभी भी लगता है कि आप सत्र का उपयोग करने से दूर हो सकते हैं। लेकिन यदि आप किसी कारण से रैली को ** ** क्वेरी स्ट्रिंग के माध्यम से ऐसा करने के लिए ** की आवश्यकता है और उस रास्ते पर जाने के इच्छुक हैं, तो शायद यह उस तरह से काम करेगा। हालांकि मेरे मुंह में अभी भी एक गंध की गंध होगी। यह अभी भी निर्भर करता है ... ** ** आप इसे क्यों चाहते हैं या ** ** आप वास्तव में क्या हासिल करना चाहते हैं? आप गलत ट्रैक पर हो सकते हैं ... – scherand

+0

मेरा उपयोग है, मैंने उपयोगकर्ता आईडी के साथ एक लिंक की सामग्री के साथ एक मेल भेजा है। जब मैं मेल में लिंक पर क्लिक करता हूं तो पृष्ठ पर नेविगेट करेगा, तो पृष्ठ विशेष उपयोगकर्ता के विवरण दिखाएगा –

1

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

+1

मैं बस जोड़ना चाहता हूं: एएसपी.नेट में एक सत्र है, स्टोर में कौन है जो लॉग इन है और आपके कोड में चेक इन करें यदि लॉग इन उपयोगकर्ता को डेटा देखने की अनुमति है – Felix

+0

सुनिश्चित करें कि आप कर सकते हैं। किसी साझा गुप्त कुंजी का उपयोग करके क्वेरी स्ट्रिंग को हैश करें या एन्क्रिप्ट करें, क्वेरी स्ट्रिंग में हैश या एन्क्रिप्टेड मान शामिल करें, और उसके बाद इसे पुन: सम्मिलित करें और क्वेरी स्ट्रिंग का उपयोग करने से पहले इसे सत्यापित करें। – xr280xr

3

यह एक अजीब आवश्यकता की तरह लगता है। क्या आप कुछ प्रकार की घरेलू उगाने वाली सुरक्षा को लागू करने की कोशिश कर रहे हैं? यदि ऐसा है, तो आपको वास्तव में नहीं करना चाहिए।

वैसे भी, आप इसे एक तरह से कर सकते हैं, यह पूरे यूआरएल http://project/page1.aspx?userID=5 लेना होगा और इसकी md5 sum की गणना करना होगा। फिर आप एमडी 5 योग को अंतिम यूआरएल में जोड़ते हैं, जैसे कि http://project/page1.aspx?userID=5&checksum=YOURCALCULATEDMD5SUM। फिर पेज 1.aspx में आपको यह सत्यापित करना होगा कि चेकसम पैरामीटर सही है।

हालांकि, यह दृष्टिकोण काफी भद्दा है और यह आपके द्वारा उपयोग किए गए एल्गोरिदम को समझने के लिए किसी भी व्यक्ति के लिए अनिवार्य रूप से बहुत लंबा नहीं लगेगा। यदि उन्होंने किया तो वे उपयोगकर्ता को "आसानी से" बदल सकते हैं और एमडी 5 योग स्वयं की गणना कर सकते हैं। एक और मजबूत दृष्टिकोण वह होगा जहां चेकसम को उस कुंजी द्वारा एन्क्रिप्ट किया गया था जिसे केवल आपके पास पहुंच थी। लेकिन फिर मुझे ऐसा करने के लिए अपने मकसद पर सवाल उठाना है, क्योंकि अन्य सुरक्षा समाधान मौजूद हैं जो बहुत बेहतर हैं।

+0

क्या यह एएसपी.नेट में "फ्री के लिए" सत्र (टोकन) क्या करता है, इस बारे में बहुत करीब नहीं होगा? यह उपयोगकर्ता को कम या ज्यादा यादृच्छिक/अर्थहीन आईडी (सत्र आईडी/टोकन) देता है जिसे तब संबंधित (सत्र) डेटा की पहचान करने के लिए उपयोग किया जाता है। क्या मै गलत हु? – scherand

+1

@scherand: का क्रमबद्ध करें ... आपके मामले में, वास्तविक डेटा सर्वर-पक्ष संग्रहीत किया जाएगा, जबकि इस मामले में डेटा (userID = 5) URL में संग्रहीत है। इसे बुकमार्क किया जा सकता है, यदि आपके पास एक ही समय में एकाधिक पेज खोलने हैं, तो –

+0

... जो एक अच्छा बिंदु लाता है, समस्याओं का कारण नहीं होगा। यदि उपयोगकर्ता उस यूआरएल तक पहुंच प्राप्त करते हैं, तो लॉगिन/अनुमति तंत्र को लागू किए बिना या चेकसम एल्गोरिदम को लागू किए बिना उस पहुंच को बाद में हटाने का कोई तरीका नहीं है। –

0

खैर - यह निर्भर करता है :)

एक संभावना यह एक सत्र चर में userID डाल करने के लिए है। तो उपयोगकर्ता मूल्य को देख या संपादित नहीं कर सकता है।

यदि आपके पास यह पता लगाने के अन्य साधन हैं कि मूल्य अमान्य (यानी मौजूद नहीं है या उस उपयोगकर्ता के लिए नहीं हो सकता है (जिसे आप किसी अन्य तरीके से पहचान सकते हैं) या जैसा) आप इसे सत्यापित करने से दूर हो सकते हैं अपने आप को पीछे कोड में इनपुट करें।

लेकिन जैसा कि आप शायद जानते हैं कि आप उपयोगकर्ता को क्वेरी स्ट्रिंग को बदलने से नहीं रोक सकते हैं।

3

आप नहीं कर सकते।

HTTP अनुरोध (यूआरएल, क्वेरी स्ट्रिंग, कुकीज़, ... सहित) में कुछ भी ग्राहक के नियंत्रण में है और नकली आसान है।

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

+5

मुझे लगता है कि ओपी को पता है कि वह ** ** ** उपयोगकर्ता को क्वेरी स्ट्रिंग को बदलने से रोक नहीं सकता है। लेकिन - कुछ हद तक - (ओं) वह ** इस तरह की एक परिवर्तित क्वेरी स्ट्रिंग से ** ** की रक्षा करने में सक्षम हो सकता है। और यही वह है जो मुझे लगता है कि प्रश्न इस बारे में है। बस मेरी दो पेंस। – scherand

1

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

प्रचुर मात्रा में संकुल/मॉड्यूल/एक समझदार तरह से प्रमाणीकरण और सत्र से निपटने के लिए आदमी भाषाओं में पुस्तकालयों रहे हैं - रोल आप अपने स्वयं के जोखिम :)

2

मेरा पसंदीदा टी है वह पीछा करता है यह क्वेरीस्ट्रिंग के छेड़छाड़ को रोकने के उद्देश्य स्पष्ट के साथ Querystring को पारदर्शी रूप से एन्कोड और डीकोड करने के लिए HTTPmodule का उपयोग करता है।

http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml

यह एकदम सही है जब सत्र एक विकल्प नहीं है!

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