2011-01-26 14 views
7

मुझे इस स्थिति के बारे में संदेह है।क्लॉज और एसक्यूएल इंजेक्शन की तरह

मैंने एक संग्रहीत प्रक्रिया के भीतर इस तरह एक प्रश्न:

SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

मेरा प्रश्न है, यह SQL इंजेक्शन के लिए असुरक्षित है? मैं कुछ इस तरह को यह बदलना होगा: (?)

declare @column1Like nvarchar(200); 

@column1Like = '%' + @column1 + '%' 

SELECT column1, column2 
FROM table1 
WHERE column1 like @column1Like 

सादर

उत्तर

6

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

यह कमजोर होगा:

EXECUTE ('SELECT column1, column2 FROM table1 WHERE column1 like ' + @column1Like); 

भी इसका मतलब है कि कोई वास्तविक (एक सुरक्षा के दृष्टिकोण से कम से कम) अपने उदाहरण के दोनों के बीच का अंतर है।

1

यह कमजोर है, क्योंकि यह पहले से ही एसक्यूएल अंतरिक्ष में एक स्ट्रिंग मान है नहीं है। हालांकि, यह क्वेरी तोड़ सकता है।

2
SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

चूंकि यह क्वेरी केवल चर के साथ काम करता है, यह डेटा की बजाय कोड डालने के लिए कोई जगह नहीं है और इसलिए SQL इंजेक्शन की चपेट में नहीं है।

मुझे लगता है कि @column1 यहां एक SQL Server चर है और आप अपने क्लाइंट-साइड भाषा में parametrized क्वेरी कार्यक्षमता का उपयोग कर रहे हैं ताकि उसे मूल्य मिल सके।

+1

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

1

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

2

= या कोई अन्य भविष्यवाणी से अलग नहीं है।

हालांकि उपयोगकर्ता पैटर्न में अतिरिक्त वाइल्डकार्ड वर्ण (%, _) इंजेक्ट कर सकता है; अगर यह मायने रखता है।

-1

मुझे लगता है कि यह असुरक्षित है, उदाहरण के लिए: '%' या यदि आप प्रारूप यह @column1Like की तरह नहीं है 1 = 1-- डेटाबेस के सभी रजिस्टरों में दिखाई देंगे।

इस मामले में, मैं से (@column1Like= '' या @column1Like is null) एक ही है यह लगता है, लेकिन आप की तरह

'%' union select SELECT `column11`, `column22` 
FROM table2 where `colum11` -- is the same type than `column1` 
--and `column22` is the same type than `column22`. 
संबंधित मुद्दे