2011-11-17 9 views
5

मैं ग्राहक के पक्ष की जांच कर रही हूँ, उपयोगकर्ता, द्वारा एक पाठ बॉक्स में ईमेल प्रवेश के लिए कि ईमेल वैध है खोजने के लिए है या नहींकैसे एक asp.net वेबसाइट में SQL इंजेक्शन को रोकने के लिए

string emailexist = "SELECT COUNT(DISTINCT UserID) as count FROM tbl_user WHERE [email protected] ";  


    <asp:RegularExpressionValidator ID="RegularExpressionValidator2" ValidationGroup="Login" ControlToValidate="txtUserName" 
          ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" CssClass="Error" 
          runat="server" /> 

इस नियमित रूप से है ईमेल के लिए एसक्यूएल इंजेक्शन को रोकने के लिए पर्याप्त अभिव्यक्ति पर्याप्त है।

अन्य पाठ:

string groupExistQuery = "SELECT COUNT(DISTINCT GroupID) as count FROM tbl_group WHERE [email protected]"; 

मैं कि क्या समूह का नाम उपयोगकर्ता द्वारा दर्ज डेटाबेस में पहले से ही उपलब्ध है की जाँच करने के सर्वर साइड में एक प्रश्न कर रहा हूँ, यहाँ एसक्यूएल इंजेक्शन प्रदर्शन करने के लिए एक मजबूत संभावना है। मुझे इससे कैसे रोकना चाहिए।

+1

मैंने सोचा था कि हम इस से अधिक हो गया था: 'asp' टैग का उपयोग न करें। –

+0

@ जोएलकोएहॉर्न - मैं वास्तव में मेटा पर चर्चा की इच्छा करता हूं जिसके परिणामस्वरूप 'एएसपी' को 'एएसपी-क्लासिक' में बदला जा रहा है :( – Polynomial

+0

+1 सिर्फ –

उत्तर

8

एक रेगेक्स एसक्यूएल इंजेक्शन के लिए असंबद्ध (ब्लैकलिस्टिंग आदि कभी भी सबसे मजबूत दृष्टिकोण नहीं है); हालांकि, पैरामीटर @Email साधनों के प्रयोग (यह मानते हुए रहता parameterised) वह यह है कि नहीं एसक्यूएल इंजेक्शन के लिए अतिसंवेदनशील।

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

उदाहरण के लिए, यदि आप ने क्या किया:

var sql = "SELECT ...snip... WHERE Email='" + email + "'"; // BAD!!!!! 

तो कि भारी एसक्यूएल इंजेक्शन के लिए अतिसंवेदनशील है। पैरामीटर का उपयोग करके, मान को क्वेरी के हिस्से के रूप में नहीं माना जाता है, इसलिए हमलावर पर हमले वेक्टर नहीं होते हैं।

+1

पूछने के लिए यह सबसे अधिक (यदि सभी नहीं) भाषाएं और डीबीएमएस सिस्टम में सच है। पैरामीटर प्रश्न लगभग हमेशा सबसे अच्छा समाधान हैं।मैं किसी व्यक्ति को कस्टम सत्यापन कोड का उपयोग करने की संख्या की गणना नहीं कर सकता हूं और फिर किसी को 'ड्रॉप टैबलेट' के साथ हिट करते समय भयभीत आश्चर्य की एक नज़र डालें। – Polynomial

4

आप डायरेक्ट एसक्यूएल का उपयोग नहीं है और इसके बजाय parameterised प्रश्नों और/या संग्रहित प्रक्रियाओं का उपयोग करके इसे रोका जा सकता है।

6

आप parameterised मूल्यों का उपयोग करते हैं तो आपको मानकों के माध्यम से इंजेक्षन नहीं कर सकते, केवल श्रेणीबद्ध मूल्यों के माध्यम से, भले ही ठीक हो जा रहे हैं।

0

Here माइक्रोसॉफ्ट पैटर्न & आपके प्रश्न के लिए प्रैक्टिस समूह का उत्तर है।

सामान्य में, सरल नियम है: गतिशील एसक्यूएल पीढ़ी का उपयोग नहीं है और अगर आप ऐसा करेंगे, आपके इनपुट स्वच्छ।

कभी सिर्फ अपने SQL क्वेरी के निर्माण के लिए तार जोड़। यदि आपको अपने आवेदन में अपने आप से कोई प्रश्न बनाने की आवश्यकता है, तो पैरामीटर के साथ parametrized SQL क्वेरी का उपयोग करें - इस तरह आप एक सुरक्षित पक्ष पर हैं।

यहाँ दस्तावेज़ मैं ऊपर के लिए लिंक प्रदान से एक उदाहरण है:

DataSet userDataset = new DataSet(); 
    SqlDataAdapter myCommand = new SqlDataAdapter( 
      "LoginStoredProcedure", connection); 
    myCommand.SelectCommand.CommandType = CommandType.StoredProcedure; 
    myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11); 
    myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text; 

    myCommand.Fill(userDataset); 
+0

मेरी टिप्पणी को संबोधित किया गया था। पर ले जाएं :) –

+0

टाइप-सेफ पैरामीटर का उपयोग करना मेरी राय में, आपके इनपुट को स्वच्छ करने का एक तरीका है। –

+0

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

1
  1. उपयोग parameterised मूल्यों
  2. सांकेतिक शब्दों में बदलना आपके तार
+1

भारी, भारी जोर से 1 पर; विकल्प 2 कुछ लोगों को ** ** ** गलत हो जाएगा। निजी तौर पर, मैं 2 के किसी भी उपयोग को स्पष्ट रूप से सफेद-सूचीबद्ध मानों (काला-सूचीबद्ध के बजाय) –

+0

@MarcGravell - सहमत हूं। उपयुक्त प्रकारों में रूपांतरण आपको फ़ॉर्मेटिंग समस्या पर सतर्क करता है, लेकिन यह निश्चित रूप से सुरक्षा उपाय नहीं है। – Polynomial

+0

एचटीएमएल एन्कोडिंग कुछ हमलों को रोकता है – user182630

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