Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में डायनेमिक SQL को कैसे साफ़ करें (SQL इंजेक्शन को रोकें)?

मेरा मानना ​​है कि तीन अलग-अलग मामले हैं जिनके बारे में आपको चिंता करने की ज़रूरत है:

  • स्ट्रिंग्स (कुछ भी जो उद्धरण की आवश्यकता है):'''' + replace(@string, '''', '''''') + ''''
  • नाम (कुछ भी जहां उद्धरण की अनुमति नहीं है):quotename(@string)
  • ऐसी चीज़ें जिन्हें उद्धृत नहीं किया जा सकता:इसके लिए श्वेतसूची की आवश्यकता है

नोट :सब कुछ एक स्ट्रिंग चर में (char , varchar , nchar , nvarchar , आदि) जो उपयोगकर्ता-नियंत्रित स्रोतों से आता है, उसे उपरोक्त विधियों में से एक का उपयोग करना चाहिए। इसका मतलब यह है कि जिन चीज़ों को आप संख्या होने की उम्मीद करते हैं, वे भी उद्धृत हो जाती हैं यदि वे स्ट्रिंग चर में संग्रहीत हैं।

अधिक विवरण के लिए, <स्ट्राइक>माइक्रोसॉफ्ट मैगजीन देखें <उप>(अप्रचलित लिंक:2016-10-19)

यहां तीनों विधियों का उपयोग करके एक उदाहरण दिया गया है:

EXEC 'SELECT * FROM Employee WHERE Salary > ''' +
     REPLACE(@salary, '''', '''''') +   -- replacing quotes even for numeric data
     ''' ORDER BY ' + QUOTENAME(@sort_col) + ' ' +  -- quoting a name
     CASE @sort_dir WHEN 'DESC' THEN 'DESC' END     -- whitelisting

यह भी ध्यान रखें कि EXEC . में सभी स्ट्रिंग ऑपरेशन इनलाइन करके करें बयान में कटौती की समस्याओं से कोई सरोकार नहीं है। यदि आप चर के लिए मध्यवर्ती परिणाम निर्दिष्ट करते हैं, तो आपको जरूरी सुनिश्चित करें कि परिणाम धारण करने के लिए चर काफी बड़े हैं। अगर आप SET @result = QUOTENAME(@name) करते हैं आपको @result . परिभाषित करना चाहिए कम से कम 258 (2 * 128 + 2) वर्ण धारण करने के लिए। अगर आप SET @result = REPLACE(@str, '''', '''''') करते हैं आपको @result . परिभाषित करना चाहिए @str . के आकार का दोगुना होना (@str . में प्रत्येक वर्ण मान लें उद्धरण हो सकता है)। और निश्चित रूप से, अंतिम SQL कथन धारण करने वाला स्ट्रिंग चर इतना बड़ा होना चाहिए कि सभी स्थिर SQL और सभी परिणाम चर धारण कर सकें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या मैं एक कॉलम में एकाधिक पंक्तियों को अल्पविराम से परिसीमित कर सकता हूँ?

  2. CTE से तालिका में रिकॉर्ड अपडेट करें

  3. Sp_reset_connection क्या करता है?

  4. एक कॉलम के लिए SQL Server 2008 हजारों विभाजक

  5. टी-एसक्यूएल में टाइमस्टैम्प का मतलब सी # में क्या है?