sql enjeksiyon için HTTP veya SQL Server tabanlı çözümler

oy
1

Kodumu desteklemek iken SQL Enjeksiyon saldırılarını engelleme herhangi bir 'otomatik' yolları olup olmadığını ben SQL Server 2005 ve Windows Server 2000 ve merak ile çalışıyorum.

Bazı yolları için olduğunu ileri sürmüşlerdir:

  1. Enjeksiyon odaklı semboller için istek yayınına ve querystrings filtreler ve hatta uygulamayı çarpmadan önce talebi başarısız ISAPI veya HTTP modülü çeşit koyun. Bu çözümler spesifik çoğu 6 veya daha yüksek IIS. Ben 5 koşuyorum.
  2. Her komut nesnesi aynı anda yalnızca tek bir SQL komutu çalıştırır Garanti.

Benim yapılandırma için Diğer fikirler?

Oluştur 09/12/2008 saat 21:41
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
1

Her zaman kullanıcı girişi sterilize

  1. Eğer izin verilmeyen eğer 'hemen kod güvenli hale getirmek için bir yol gider
  2. sorgu bir tamsayı bekliyorsa, giriş bir tamsayı olduğundan emin olun. vb
Cevap 07/03/2009 saat 13:27
kaynak kullanıcı

oy
1

Benim sunucuda enjeksiyon saldırısı girişimi bir grup vardı, ben gereksiz kaynaklarını götürüyorlardı endişeliydi. Ben (hacklenmiş!) Yazdı çoğu xss ve sql enjeksiyon saldırıları filtreler, c # HttpModule'ü. Kod, bir web sitesi kullanmak yapmak için gereken yapılandırma bölümü ile birlikte aşağıda yapıştırılır. Bu bir proje koymak ve daha sonra web projesi tarafından başvurulan (veya başka şekilde bin dizininde düştü) gerekmektedir WebSecurityFilter.dll için derlenmiş olmalıdır.

Bu yalnızca bu yüzden umarım sitenizin asp.net dayanır, asp.net ile çalışacak (ben bir yorumda sormak yaptı ama cevap vermedi).

Web yapılandırma bölümü (ait <httpmodules> bölümünde ekleyin <system.web>:

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

modülü (SecurityHttpModule.cs) için kod:

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
    }
}

Umarım her şey yoluna biçimlendirilmiş ...

Bu akşam bir zip tam proje için bir bağlantı sonrası çalışacağım.

Cevap 09/12/2008 saat 22:34
kaynak kullanıcı

oy
1

Tüm veritabanı aramaları ya depolanır prosedürleri veya parametrize sorgular kullandığından emin olun.

Cevap 09/12/2008 saat 22:08
kaynak kullanıcı

oy
1

Bu çözüm önerisi:

Her komut nesnesi aynı anda yalnızca tek bir SQL komutu çalıştırır Garanti.

Aslında enjeksiyon engellemez. Örneğin, bir giriş sorgu kimlik bilgileri olmadan giriş için saldırgan tarafından enjekte edilebilir. Düşünmek:

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

Bu şablon bir KullanıcıNo enjekte edilebilir:

' OR 1=1 --

Verim:

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

kodundan açığını ortadan kaldırarak üzerinde çaba odaklanın.

Cevap 09/12/2008 saat 21:56
kaynak kullanıcı

oy
1

Genel olarak, SQL enjeksiyonu karşı korumak için otomatik bir çözüm yoktur. SQL enjeksiyon bir uygulama hatası değil, bir veritabanı hatam.

Eğer sorguya uygulama verilerini interpolates SQL çalıştırmak tüm vakaların kod inceleme yapmak için çözümdür.

Cevap 09/12/2008 saat 21:49
kaynak kullanıcı

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