HTTP या एसक्यूएल एसक्यूएल इंजेक्शन के लिए सर्वर आधारित समाधान

वोट
1

मैं SQL सर्वर 2005 और विंडोज सर्वर 2000 और आश्चर्य के साथ काम कर रहा हूँ अगर कोई 'स्वचालित' SQL इंजेक्शन हमलों को अवरुद्ध करते हुए मैं अपने कोड को किनारे के तरीके हैं।

कुछ सुझाव दिया है वहाँ के तरीके हैं कि:

  1. ISAPI या HTTP मॉड्यूल किसी तरह का है कि इंजेक्शन उन्मुख प्रतीकों के लिए अनुरोध पोस्ट और querystrings फिल्टर और अनुरोध विफल रहता से पहले ही आवेदन हिट में रख दें। इन समाधानों विशिष्ट के अधिकांश 6 या बाद IIS। मैं चल रहा हूँ 5।
  2. कि प्रत्येक आदेश वस्तु एक समय में केवल एक ही एसक्यूएल आदेश चलाता गारंटी।

मेरी विन्यास के लिए कोई अन्य विचार?

09/12/2008 को 21:41
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
1

हमेशा उपयोगकर्ता इनपुट स्वच्छ

  1. अगर आप को अनुमति नहीं दी 'आप तुरंत अपने कोड को सुरक्षित बनाने के लिए कुछ मदद मिलेगी
  2. अगर आपकी क्वेरी एक पूर्णांक उम्मीद, सुनिश्चित करें कि इनपुट एक पूर्णांक है बनाते हैं। आदि
07/03/2009 को 13:27
का स्रोत उपयोगकर्ता

वोट
1

जब मैं अपने सर्वर पर इंजेक्शन हमले के प्रयास का एक समूह था, मैं चिंतित था कि वे अनावश्यक संसाधनों को ले रहे थे। मैं (काट दिया!) लिखा सी # में एक HttpModule कि सबसे बाहर XSS और SQL इंजेक्शन हमले फ़िल्टर हो जाएंगे। नीचे दिए गए कोड चिपकाया जाता है, config एक वेबसाइट के लिए इसका इस्तेमाल करने के लिए आवश्यक अनुभाग भी होगा। यह एक परियोजना में डाल दिया और WebSecurityFilter.dll है, जो तब वेब परियोजना द्वारा संदर्भित किया जाना चाहिए (या अन्यथा बिन निर्देशिका में गिरा दिया) को संकलित किया जाना चाहिए।

यह केवल, asp.net के साथ काम करेंगे इसलिए उम्मीद है कि आपकी साइट asp.net आधारित है (मैं एक टिप्पणी में पूछने किया था, लेकिन कोई जवाब नहीं मिला है)।

वेब config अनुभाग (के <httpModules> खंड में इसे जोड़ने <system.web>:

  <add name="SecurityHttpModule" type="WebSecurityFilter.SecurityHttpModule, WebSecurityFilter" />

मॉड्यूल (SecurityHttpModule.cs) के लिए कोड:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Text.RegularExpressions;

namespace WebSecurityFilter
{
    class SecurityHttpModule : IHttpModule
    {
        class RegexWithDesc : Regex
        {
            string _errorText;

            public string ErrorText
            {
                get { return _errorText; }
            }

            public RegexWithDesc(string regex, RegexOptions options, string errorText)
                :base(regex, options)
            {
                _errorText = errorText;
            }
        }
        /// <summary>
        /// error text displayed when security violation is detected
        /// </summary>
        private string _errorhtml =
        @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.1//EN"" ""http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"">" +
        @"<html xmlns=""http://www.w3.org/1999/xhtml"" >" +
        @"<body style=""background:black;"">" +
        @"<table style=""width:100%"" >" +
        @"<tr><td align=""center"">" +
        @"<div style=""border:3px solid red;text-align:center;width:95%;color:red;padding:10px;text-decoration:blink;"">" +
        @"SECURITY VIOLATION" +
        @"<br/>" +
        //@"<br/>" +
        //@"go away" +
        //@"<br/>" +
        @"<br/>" +
        @"{0}" +
        @"<br/>" +
        @"</div>" +
        @"</td></tr>" +
        @"</table>" +
        @"</body>" +
        @"</html>";

        // regex for default checks
        // http://www.securityfocus.com/infocus/1768
        static RegexOptions _defaultRegexOptions = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace;

        RegexWithDesc[] _regexCollection = new RegexWithDesc[] 
        { 
            new RegexWithDesc(@"((¼|<)[^\n]+(>|¾)*)|javascript|unescape", _defaultRegexOptions, "XSS 1"), //3.3
            // new RegexWithDesc(@"(\')|(\-\-)", _defaultRegexOptions, "SQL 1"), //2.1
            new RegexWithDesc(@"(=)[^\n]*(\'|(\-\-)|(;))", _defaultRegexOptions, "SQL 2"),    //2.2
            //new RegexWithDesc(@"\w*(\')(or)", _defaultRegexOptions, "SQL 3"),  //2.3
            new RegexWithDesc(@"(\')\s*(or|union|insert|delete|drop|update|create|(declare\s+@\w+))", _defaultRegexOptions, "SQL 4"),   //2.4
            new RegexWithDesc(@"exec(((\s|\+)+(s|x)p\w+)|(\s@))", _defaultRegexOptions, "SQL 5")    //2.5
        };
        #region IHttpModule Members

        public void Dispose()
        {
           // nothing to do
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            try
            {
                List<string> toCheck = new List<string>();
                foreach (string key in HttpContext.Current.ApplicationInstance.Request.QueryString.AllKeys)
                {
                    toCheck.Add(HttpContext.Current.ApplicationInstance.Request[key]);
                }
                foreach (string key in HttpContext.Current.ApplicationInstance.Request.Form.AllKeys)
                {
                    toCheck.Add(HttpContext.Current.ApplicationInstance.Request.Form[key]);
                }
                foreach (RegexWithDesc regex in _regexCollection)
                {
                    foreach (string param in toCheck)
                    {
                        string dp = HttpUtility.UrlDecode(param);
                        if (regex.IsMatch(dp))
                        {
                            HttpContext.Current.ApplicationInstance.Response.Write(string.Format(_errorhtml, regex.ErrorText));
                            HttpContext.Current.ApplicationInstance.CompleteRequest();
                            return;
                        }
                    }
                }

            }
            catch (System.Threading.ThreadAbortException x)
            {
                throw;
            }
            catch (Exception ex)
            {
                HttpContext.Current.ApplicationInstance.Response.Write(string.Format(_errorhtml, "Attack Vector Detected"));
                HttpContext.Current.ApplicationInstance.Response.Write(string.Format(_errorhtml, ex.GetType().ToString()));
                HttpContext.Current.ApplicationInstance.CompleteRequest();
                return;
            }
        }

        #endregion
    }
}

उम्मीद है कि यह सब ठीक स्वरूपित ...

मैं आज शाम को एक ज़िप में पूरा परियोजना के लिए एक लिंक पोस्ट करने की कोशिश करेंगे।

09/12/2008 को 22:34
का स्रोत उपयोगकर्ता

वोट
1

सुनिश्चित करें कि आपके सभी डेटाबेस कॉल या तो संग्रहित प्रक्रियाओं या parametrized प्रश्नों का उपयोग करें।

09/12/2008 को 22:08
का स्रोत उपयोगकर्ता

वोट
1

इस प्रस्तावित समाधान:

कि प्रत्येक आदेश वस्तु एक समय में केवल एक ही एसक्यूएल आदेश चलाता गारंटी।

वास्तव में इंजेक्शन नहीं रोकता है। उदाहरण के लिए, एक लॉगिन क्वेरी क्रेडेंशियल्स बिना लॉग इन करने के लिए किसी आक्रमणकर्ता द्वारा इंजेक्ट किया जा सकता। विचार करें:

"SELECT COUNT(*) FROM Users WHERE UserId = '{0}' AND PassHash = '{1}'"

इस टेम्पलेट की एक प्रयोक्ता-आईडी के साथ इंजेक्ट किया जा सकता:

' OR 1=1 --

उपज:

"SELECT COUNT(*) FROM Users WHERE UserId = '' OR 1=1 --' AND PassHash = 'sdfklahsdlg'"

कोड से जोखिम को नष्ट करने पर अपने प्रयास ध्यान दें।

09/12/2008 को 21:56
का स्रोत उपयोगकर्ता

वोट
1

वहाँ सामान्य रूप में एसक्यूएल इंजेक्शन के खिलाफ की रक्षा करने के लिए कोई स्वत: समाधान है। एसक्यूएल इंजेक्शन एक आवेदन गलती, नहीं एक डेटाबेस गलती है।

समाधान आप सभी मामलों में जहां आप एसक्यूएल कि क्वेरी में आवेदन डेटा interpolates पर अमल के कोड की समीक्षा करने के लिए है।

09/12/2008 को 21:49
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more