Le soluzioni basate su server HTTP o SQL per SQL injection

voti
1

Sto lavorando con SQL Server 2005 e Windows Server 2000 e mi chiedo se ci sono dei modi 'automatici' di bloccare gli attacchi SQL Injection, mentre io puntellare la mio codice.

Alcuni hanno suggerito che ci sono modi per:

  1. Mettere in una sorta di modulo ISAPI o HTTP che filtra richiesta posta e querystrings per i simboli di iniezione-oriented e non riesce la richiesta prima che colpisca ancora l'applicazione. La maggior parte di queste soluzioni specifiche IIS 6 o superiore. Io corro 5.
  2. Garantire che ogni oggetto comando viene eseguito solo un singolo comando SQL alla volta.

Eventuali altre idee per la mia configurazione?

È pubblicato 09/12/2008 alle 21:41
fonte dall'utente
In altre lingue...                            


5 risposte

voti
1

sterilizzare sempre input dell'utente

  1. se non consentiti 'si sarebbe immediatamente in qualche modo a rendere il codice più sicuro
  2. se la query si aspetta un numero intero, assicurarsi che l'ingresso è un numero intero. eccetera
Risposto il 07/03/2009 a 13:27
fonte dall'utente

voti
1

Quando ho avuto un po 'di tentativi di attacco di iniezione sul mio server, ero preoccupato che stavano prendendo le risorse non necessarie. Ho scritto (hackerato!) Un HttpModule in C # che filtrare la maggior parte degli attacchi XSS e SQL injection. Il codice viene incollato seguito, insieme con la sezione di configurazione richiesta per fare un sito web usarlo. Dovrebbe essere messo in un progetto e compilato a WebSecurityFilter.dll, che dovrebbe essere poi applicata dal progetto web (o comunque caduto nella directory bin).

Questo funziona solo con asp.net, quindi speriamo che il vostro sito si basa asp.net (Ho chiesto in un commento, ma non ho ricevuto risposta).

sezione web di configurazione (inserirlo nella sezione <httpModules> di <system.web>:

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

Codice per modulo (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
    }
}

Speriamo che tutto va bene formattato ...

Cercherò di postare un link al progetto completo in un lampo questa sera.

Risposto il 09/12/2008 a 22:34
fonte dall'utente

voti
1

Assicurarsi che tutte le chiamate di database utilizzano sia le stored procedure o query parametrizzate.

Risposto il 09/12/2008 a 22:08
fonte dall'utente

voti
1

Questa soluzione proposta:

Garantire che ogni oggetto comando viene eseguito solo un singolo comando SQL alla volta.

in realtà non evitare l'iniezione. Ad esempio, una query di accesso può essere iniettato da un utente malintenzionato di accedere senza credenziali. Prendere in considerazione:

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

Questo modello può essere iniettato con un UserId di:

' OR 1=1 --

cedendo:

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

Focalizza la tua fatica a eliminare la vulnerabilità dal codice.

Risposto il 09/12/2008 a 21:56
fonte dall'utente

voti
1

Non esiste una soluzione automatica per la protezione contro l'iniezione SQL in generale. SQL injection è un errore dell'applicazione, non è un errore di database.

La soluzione è per voi di fare la revisione del codice di tutti i casi in cui si esegue SQL che interpola i dati delle applicazioni nella query.

Risposto il 09/12/2008 a 21:49
fonte dall'utente

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