2012-04-14 19 views
6

में एसक्यूएल इंजेक्शन से सुरक्षा मैं अपने आवेदन की सुरक्षा में सुधार करने की कोशिश कर रहा हूं। जब भी मुझे उपयोगकर्ता से डेटा प्राप्त होता है (चाहे POST या GET के माध्यम से) जिसे पूर्णांक माना जाता है, मैं इसे उचित रूप से मान्य करता हूं। लेकिन अक्सर डेटा VARCHAR होता है, और कभी-कभी HTML हो सकता है।कोल्डफ्यूजन

मैं उस मामले में एसक्यूएल इंजेक्शन से अपने डीबी की रक्षा कैसे करूं?

एक VARCHAR मूल्य के अंदर एक दुर्भावनापूर्ण SQL विवरण भेजने से क्वेरी की रक्षा <cfqueryparam value="#form.textInput#" cfsqltype="cf_sql_varchar"> करता है?

उत्तर

5

आपके प्रश्न का संक्षिप्त उत्तर 'हां' है।

मैं तीन विधियों का उपयोग कर हैकिंग प्रयासों को अवरुद्ध करता हूं।

  1. मैं अपने सभी डेटाबेस प्रश्नों में cfqueryparam का उपयोग करता हूं। मैं url scope चर के लिए टेम्पलेट/cfm फ़ाइलों के शीर्ष पर cfparam का उपयोग करूंगा।

  2. मैं Portcullis या इसके वेरिएंट का इस्तेमाल किया है। आप इसे http://portcullis.riaforge.org/ से प्राप्त कर सकते हैं। पोर्टकुलिस कुछ क्रॉस साइट स्क्रिप्टिंग हमलों के खिलाफ भी बचाव करेगा।

  3. मैं Windows आईआईएस 7.5 (Windows Server 2008 R2) का उपयोग करें। मैं यूआरएल आधारित हमलों के ब्लॉक को अवरुद्ध करने के लिए यूआरएल रिवाइट फीचर का उपयोग करता हूं। आप अपाचे के साथ समान चीजें कर सकते हैं और पुनः लिखने के लिए पुनः लिख सकते हैं। यहाँ मेरी आईआईएस URL पुनर्लेखन नियम हैं:

    <?xml version="1.0" encoding="UTF-8"?> 
    <appcmd> 
        <CONFIG CONFIG.SECTION="system.webServer/rewrite/globalRules" path="MACHINE/WEBROOT/APPHOST" overrideMode="Inherit" locked="false"> 
         <system.webServer-rewrite-globalRules> 
          <rule name="SQL Injection - EXEC - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*EXEC\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - EXEC - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*EXEC\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - CAST - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*CAST\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - CAST - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*CAST\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - DECLARE - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*DECLARE.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - DECLARE - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*DECLARE.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - NVARCHAR - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*CHAR\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - NVARCHAR - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*CHAR\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - sp_password - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*sp_password.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - sp_password - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*sp_password.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - xp - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*%20xp_.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - xp - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*%20xp_.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
         </system.webServer-rewrite-globalRules> 
        </CONFIG> 
    </appcmd> 
    

ये नियम सी में जुड़ जाते हैं: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config आईआईएस के लिए फ़ाइल। हालांकि मैं **** नहीं **** अनुशंसा करता हूं कि आप सीधे इस फ़ाइल को संपादित करें। एक गलती और आईआईएस लोड नहीं होगा। इसके बजाय & कॉपी करें नियम ऊपर पेस्ट करें और उन्हें "iis-global-rewrite.xml" के रूप में सहेजें। फिर अपने आईआईएस सर्वर से नियम जोड़ने के लिए निम्नलिखित बैच फ़ाइल चलाएँ:

C:\Windows\System32\inetsrv\appcmd.exe set config -in < iis-global-rewrite.xml 

आईआईएस पुनर्लेखन नियम IIS 7.0 (विंडोज सर्वर 2008) के साथ काम करना चाहिए लेकिन मैं यह परीक्षण नहीं किया।

ये नियम भी web.config फ़ाइल का उपयोग कर एक ही साइट पर लागू किया जा सकता है आप सर्वर तक पहुँच नहीं है, तो।

मैं सुरक्षा के लिए तीन अलग-अलग तरीकों का उपयोग क्यों करूं? क्योंकि उनमें से कोई भी सभी अड्डों को कवर नहीं करता है। आईआईएस पुनर्लेखन नियम केवल यूआरएल आधारित हमलों के खिलाफ सुरक्षा करते हैं। हैकर फॉर्म सबमिशन हमलों का भी उपयोग कर सकते हैं जो एक ही काम करते हैं। मैं सुरक्षा की पहली पंक्ति के रूप में आईआईएस नियमों को प्राथमिकता देता हूं क्योंकि यह PHP, एएसपी इत्यादि सहित सर्वर पर सभी साइटों के साथ काम करेगा। पोर्टकुलिस कोल्डफ्यूजन के लिए रक्षा की एक अच्छी दूसरी पंक्ति है क्योंकि यह फॉर्म आधारित हमलों और कुछ क्रॉस साइट स्क्रिप्टिंग को पकड़ लेगी हमला करता है। रक्षा की आखिरी पंक्ति cfqueryparam/cfparam कोड है जो यूआरएल/फॉर्म आधारित एसक्यूएल इंजेक्शन हमलों के खिलाफ सुरक्षा करता है।

यदि इन तीनों विधियों का उपयोग किया जाता है तो सर्वर/साइट बहुत सुरक्षित होनी चाहिए। मैं समय-समय पर सर्वर लॉग की समीक्षा करने की सलाह दूंगा क्योंकि हमले विकसित होते हैं और सुधार करते हैं।

+1

वाह, यह बिल्कुल सही है। मैं वास्तव में आईआईएस पर सीएफ चला रहा हूं, इसलिए मैं निश्चित रूप से कुछ और उन्नत पुनर्लेखन नियमों के साथ अपने वेब ऐप को सुरक्षित रखने में देखूंगा। धन्यवाद! – Eleeist

+0

आईआईएस यूआरएल रिवाइट और अपाचे mod_rewrite रक्षा और एसईओ के लिए बहुत उपयोगी उपकरण हैं। http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx में आईआईएस यूआरएल रिवाइट के लिए कुछ उपयोगी उदाहरण हैं। –

6

संक्षिप्त उत्तर हाँ है।

cfqueryparam कुछ एसक्यूएल इंजेक्शन हमलों को होने से रोक देगा।

अन्य हमले चर कि इस्तेमाल किया जा सकता हैं, इसलिए सावधान रहना है, लेकिन अच्छी तरह से लिखा coldfusion बहुत ही सुरक्षित हो सकता है।

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

+0

धन्यवाद! वह वास्तव में सहायक था। – Eleeist

+3

एकमात्र समय जब cfqueryparam * एसक्यूएल इंजेक्शन हमले को रोक नहीं देगा * हमले की प्रकृति के साथ कुछ भी नहीं होगा, लेकिन डेटाबेस पर कोड की प्रकृति होगी। उदाहरण के लिए, यदि आप कुछ डेटाबेस प्रक्रिया को कॉल करना चाहते थे जो एक वर्चर तर्क लेता था और इसे गतिशील रूप से एसक्यूएल के रूप में चलाता था, तो कोई भी पैरामीटिज्ड क्वेरीिंग आपकी मदद नहीं करेगी। सादे एसक्यूएल (कोई डेटाबेस प्रक्रिया कॉल इत्यादि) का उपयोग करते समय CfQueryParam * हमेशा * एसक्यूएल इंजेक्शन हमलों को रोक देगा। –

+1

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

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