2009-12-02 11 views
6

मैं बस यहाँ साबित होता है कि इस सरल समारोह काफी अच्छा दुनिया में हर एसक्यूएल इंजेक्शन को रोकने के लिए नहीं है कोशिश कर रहा हूँ:साबित SQL इंजेक्शन

Function CleanForSQL(ByVal input As String) As String 
    Return input.Replace("'", "''") 
End Function 

यहाँ हमारे ऐप्स से एक ठेठ डालने बयान है :

Database.DBUpdate("UPDATE tblFilledForms SET Text1 = '" + CleanForSQL(txtNote.Text) + "' WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString) 

मैं अपने सुरक्षित नहीं पता, क्योंकि googling और StackOverflow.com पर अन्य प्रश्न को देख के। Here एक प्रश्न है जिसे मैंने पाया है जिसमें मैंने ऊपर प्रस्तुत किए गए सभी कार्य अप्रासंगिक और व्यर्थ हैं।

तो पोस्ट मैं से जुड़ा हुआ है, बस

'Chr (8) टाइप पर आधारित है; अद्यतन tblMaint सेट मान 1 = 2 कहां ValueID = 2--

txtNote में

पूरे tblFilledForms तालिका में टेक्स्ट 1 में हर मूल्य स्पष्ट करने के लिए पर्याप्त होना चाहिए, और फिर अद्यतन tblmaint मेज की दूसरी पंक्ति 2 सही होने के लिए?

क्या चाहिए यहाँ हो कि वीबी

अद्यतन tblFilledForms के रूप में इस व्याख्या करेगा सेट पाठ 1 है = '' 'Chr (8); अद्यतन tblMaint सेट मान 1 = 2 कहां ValueID = 2-- 'कहां FilledFormID = 5120327

और SQL के लिए भेज जो प्रशिक्षु निष्पादित करेंगे Chr (8) तीसरे को मिटाने के लिए' जो उत्पादन होता

अपडेट करें tblFilledForms SET Text1 = ''; अद्यतन करें tblMaint SET Value1 = 2 WHERE ValueID = 2-- 'जहां FilledFormID = 5120327

वास्तव में डेटाबेस पर निष्पादित करने के लिए सही है?

मैंने क्लिपबोर्ड से एक Chr (8) को कॉपी किया और क्लिपबोर्ड सामग्री के साथ टेक्स्टबॉक्स में Chr (8) को प्रतिस्थापित किया और अभी भी कोई नहीं जाना। यह पूरी स्ट्रिंग को सीधे क्षेत्र w/o समस्याओं में डाल देता है।

तो मैं यहां क्या गलत कर रहा हूं? या इसे तोड़ने के लिए मैं और क्या कर सकता हूं?

टेक्नोलॉजीज और पृष्ठभूमि: मैं एमएस SQL ​​सर्वर 2005, और वीबी नेट उपयोग कर रहा हूँ 2005 डेटाबेस में पाठ 1 क्षेत्र एक VARCHAR (600) क्षेत्र (मेरे कारण है कि इसकी नहीं मैक्स मत पूछो है, इसके व्यर्थ, मुझे पता है) तालिका पर कुछ ट्रिगर्स हैं जो इस तरह के बड़े पैमाने पर अपडेट को रोक देंगे और इंजेक्शन वास्तव में सही काम करते हैं तो कुछ त्रुटियों को फेंक देंगे।

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

इस प्रश्न को पढ़ने के लिए किसी को भी यह जानने के लिए कि अपने टेक्स्ट फ़ील्ड को बेहतर तरीके से कैसे फ़िल्टर किया जाए, जवाब नहीं है! पैरामीटर का प्रयोग करें! वे बहुत बेहतर, सुरक्षित और आसान हैं!

+5

डाउनवोट लोगों को धमकी देने और उसी पैराग्राफ में सिद्धांतों के बजाय प्रिंसिपल लिखने के लिए डाउनवोट। –

+0

वैसे आपका Chr (8) एक स्ट्रिंग के अंदर समाप्त होता है इसलिए यही कारण है कि एसक्यूएल इसका मूल्यांकन नहीं कर रहा है। –

+6

@ विंको मुझे यह उचित नहीं लगता है, वह बस जवाबों के लिए दिशानिर्देश स्थापित कर रहा था।तो जवाबों का पूरा समूह प्राप्त करने के बजाय सभी एक ही बात कह रहे हैं, उन्हें 1 या 2 मिलता है जो उसे बताता है कि वह क्या चाहता है। – Zoidberg

उत्तर

6

Chr (8) उद्धृत शाब्दिक स्ट्रिंग का हिस्सा है, जैसा कि अद्यतन कथन है, इसलिए SQL सर्वर इसे फ़ंक्शन कॉल के रूप में समझने वाला नहीं है। इस उदाहरण के साथ, पाठ 1 शाब्दिक मान पर सेट हो जाएगा: इस उदाहरण के साथ (जो एकल उद्धरण सहित हाँ,)

'Chr(8); update tblMaint SET Value1 = 2 WHERE ValueID = 2-- 

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

+0

+1 किया गया क्योंकि आपका उत्तर इस प्रश्न के अंतिम उत्तर के रूप में आकार दे रहा है। – Jrud

0

मुझे लगता है कि तुम्हारी समस्या है कि Chr(8) निष्पादित नहीं किया जाता है, तो आप किसी अन्य तरीके से प्रमुख उद्धरण चिह्न प्राप्त करने के लिए खोजने की जरूरत है।

+0

हाँ मैं करता हूं ... कोई सुझाव? – Jrud

1

आप कुछ भी गलत नहीं कर रहे हैं। इस प्रकार SQL सर्वर तारों को पार करता है। पहला उद्धरण स्ट्रिंग को खोलता है, फिर आप तुरंत पीछा किए गए उद्धरण के साथ पीछा करते हैं जिसके बाद Chr (8) होता है।

एक अभ्यास के रूप में, यदि आप इसे SQL सर्वर में चलाते हैं तो क्या होता है: SELECT '''Hello'? इस मामले में बिल्कुल उसी पार्सिंग नियम लागू किए जा रहे हैं।

+0

हां, यह वही है जो चल रहा है, मैं समझता हूं। लेकिन मुझे अभी भी इसे किसी भी तरह तोड़ने की जरूरत है ... – Jrud

+0

आपको इसे तोड़ने की जरूरत नहीं है - आपको बस यह साबित करने की आवश्यकता है कि आपकी तकनीक सभी मामलों के लिए काम करती है या नहीं। –

+0

हां, यदि यह सभी मामलों के लिए काम करता है, तो उन्मूलन द्वारा अनुमोदित किया जाता है। – Jrud

4

आपकी CleanForSQL विधि केवल स्ट्रिंग स्थितियों को संभालती है। क्या होता है जब आप स्ट्रिंग का उपयोग नहीं कर रहे हैं लेकिन इसके बजाय एक आईएनटी? उस स्थिति में, बंद करने के लिए कोई अंत टिक नहीं होगा, इसलिए इंजेक्शन अभी भी होगा। इस उदाहरण पर विचार ...

Database.DBUpdate("UPDATE tblFilledForms SET Int1 = " + CleanForSQL(txtNote.Text) + " WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString) 
उस मामले में

, बस निम्नलिखित काम करेंगे में प्रवेश ...

0; update tblMaint SET Value1 = 2 WHERE ValueID = 2--

+0

हम उपयोगकर्ताओं को उन टेक्स्ट फ़ील्ड में किसी भी संख्या टाइप करने की अनुमति नहीं देते हैं जिन्हें पहली बार संख्यात्मक होने के लिए चेक नहीं किया गया है। मुझे यकीन है कि यह एक संख्यात्मक क्षेत्र होने पर तोड़ देगा, लेकिन हम इसके लिए इस विधि का उपयोग नहीं करते हैं। यह तारों के लिए सख्ती से है। – Jrud

+4

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

+2

+1 क्वेरी स्ट्रिंग्स - और यह न भूलें कि कोई भी आपके पृष्ठ पर पोस्ट करने के लिए नकली रूप बना सकता है। मुझे नहीं पता कि कैसे DGVNotes.SelectedRows (0) .ल्स ("FilledFormID") सेट हो रहा है, लेकिन यदि यह ब्राउज़र से सभी पर आ रहा है, तो SQL को इंजेक्शन दिया जा सकता है। मुझे पता है कि आप हमेशा अपने संख्यात्मक क्षेत्रों की जांच करते हैं, लेकिन यदि आप कभी भूल जाते हैं, तो यह एक छेद खोलता है। –

3

स्कॉट Ivey क्लासिक मामले कि इसे तोड़ सकते हैं नहीं है, उद्धरण की कमी एक संख्यात्मक इनपुट की रक्षा। (+ 1'ed)

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

\ '; ड्रॉप yourTable; - => \ ''; ड्रॉप yourTable; -

कि

UPDATE tblFilledForms SET Text1 = '" + \''; DROP yourTable;-- + ' etc. 

तो है कौन सा रूप में अपने एसक्यूएल स्ट्रिंग में चला जाता है:

UPDATE tblFilledForms SET Text1 = '\''; DROP yourTable;-- ' etc. 

'\' 'एक भी बोली का शाब्दिक स्ट्रिंग के रूप में लिया जाता है, अगर आपका डेटाबेस बच निकले वर्णों का समर्थन करता है - आपके समझौता बिंगो।

समान रूप से सुरक्षा को प्रभावी होने के लिए याद किया जाना चाहिए, यहां तक ​​कि उदाहरण अद्यतन कथन भी प्रदान किया गया है जहां खंड में पैरामीटर की रक्षा करने में असफल रहा, क्योंकि यह डीजीवीएनोट्स। चयन किए गए पंक्तियां (0) .ल्स ("FilledFormID")। मान। ToString) किसी उपयोगकर्ता द्वारा कभी दर्ज नहीं किया जा सकता है? क्या यह ऐप आदि के पूरे जीवनकाल के लिए सच होगा?

+0

शायद केवल डीबी तकनीक का उपयोग कर रहा हूं ... एमएस एसक्यूएल सर्वर का मतलब यह है कि आप वास्तव में टाइप करना चाहते थे \ 'यह एक शाब्दिक या बचने वाला चरित्र नहीं है। एसक्यूएल सर्वर के लिए, दो सिंगल कोट्स को एक शाब्दिक सिंगल कोट के रूप में व्याख्या किया जाता है जो स्ट्रिंग के भीतर किसी भी '' को एक शाब्दिक 'में पारित कर देता है और इसे निष्पादित नहीं किया जाएगा। – Jrud

+0

हां, एसक्यूएल केवल कुछ चीजों से बच निकलता है और उपयोग करता है [बचने के रूप में, MySQL का उपयोग करता है \ मुझे विश्वास है कि इस समस्या में चल रहा है। – Andrew

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