2010-03-04 11 views
8

संभव डुप्लिकेट:
Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?उपयोगकर्ता इनपुट द्वारा यह SQL क्वेरी कोड टूटा/शोषित किया जा सकता है?

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

यहाँ आवश्यक मूल कोड (मेरे द्वारा नहीं लिखा), सी # में अनुवाद आसान उपभोग के लिए है:

private string _Escape(string input) 
{ 
    return input.Replace("'", "''"); 
} 

private bool _IsValidLogin(string userName, string password) 
{ 
    string sql = 
     string.Format 
     (
      @"SELECT COUNT(*) FROM UserAccounts 
       WHERE UserName = '{0}' AND Password = '{1}'", 
      _Escape(userName), 
      _Escape(password) 
     ); 
    // ... 
}

यह वास्तव में लगता है जैसे कि यह किसी तरह से तोड़ा जा सकता है, लेकिन मैं एक नुकसान में हूँ उपयोगकर्ता इनपुट द्वारा इसका शोषण कैसे किया जा सकता है। मान लें कि उपयोगकर्ता इनपुट तब तक unfiltered है जब तक यह _IsValidLogin हिट नहीं करता है, और भूल जाते हैं कि पासवर्ड सादा पाठ में संग्रहीत होते हैं।

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

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

नोट 2: मैंने इस प्रश्न को डेटाबेस-अज्ञेयवादी के रूप में व्यक्त किया है, लेकिन यदि आप किसी निश्चित इंजन के लिए इस कोड का फायदा उठा सकते हैं, तो मैं आपके योगदान का स्वागत करता हूं।

+1

यदि आप पहले से ही नहीं हैं तो यहां पढ़ने के लायक है: http://stackoverflow.com/questions/139199/can-i-protect-against-sql-injection-by-escaping-single-quote-and- आसपास के उपयोगकर्ता –

+0

@ निक: धन्यवाद, मैंने उसे नहीं देखा। मैं इस प्रश्न को डुप्लिकेट के रूप में बंद कर दूंगा। –

+0

लेखक के अनुरोध पर बंद। –

उत्तर

3

इसे बैकस्लाश द्वारा बहिष्कृत किया जा सकता है।

password = foo\' OR 1=1 -- 

हो जाता है:

password = foo\'' OR 1=1 -- 

क्वेरी:

"SELECT COUNT(*) FROM UserAccounts 
       WHERE UserName = '{0}' AND Password = 'foo\'' OR 1=1 --'" 

-- इस उदाहरण में टिप्पणी निशान है।

समाधान प्रोग्राम को केवल फ़िल्टर (डुप्लीकेट) एस्ट्रोफ़ेस मानता है।

+0

मैं अन्य डेटाबेस के लिए नहीं कह सकता, लेकिन बैकस्लैश एमएसएसक्यूएल में एक बचने वाला चरित्र प्रतीत नहीं होता है, और इसका उपयोग केवल शाब्दिक रूप से किया जाएगा। आपका उदाहरण केवल 'foo \' या 1 = 1 - ' –

0

ठीक है, मैं इसे कमजोर तरीके से नहीं देख सकता। तो, आइए एक अलग कारण पर बहस करें कि इसे क्यों बदला जाना चाहिए --- यह बल्कि असमान है। एमएसएसक्यूएल में (और, मुझे लगता है कि, अधिकांश अन्य उच्च अंत एसक्यूएल सर्वर), प्रश्नों को पार्स किया गया है, और निष्पादन योजना तैयार की गई है, और फिर क्वेरी और योजना संग्रहित की जाती है। यदि exact क्वेरी की प्रतिलिपि दोबारा अनुरोध की जाती है, तो सहेजी गई निष्पादन योजना का उपयोग किया जाता है। पैरामीटर इस पर प्रभाव नहीं डालता है, इसलिए यदि आप पैरामीटर का उपयोग करते हैं, तो यह योजनाओं का पुन: उपयोग करेगा; यदि आप पाठ को एम्बेड करते हैं, तो यह कभी नहीं होगा। http://unixwiz.net/techtips/sql-injection.html

देखें "ढूँढना तालिका नाम":

+0

के पासवर्ड की खोज करेगा, यह कमजोर है। उदाहरण बाध्यकारी किसी भी पैरामीटर का उपयोग नहीं करता है। – erenon

1

यह एक बहुत अच्छी लेख है।

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