HTTP oder SQL Server-basierten Lösungen für SQL-Injection

stimmen
1

Ich arbeite mit SQL Server 2005 und Windows Server 2000 und frage mich, ob es irgendwelche ‚automatisierte‘ Möglichkeiten von SQL-Injection-Angriffe blockiert, während ich meinen Code abzustützen.

Einige haben vorgeschlagen, dass es Möglichkeiten gibt zu:

  1. Setzen Sie in irgendeiner Art von ISAPI oder HTTP-Modul, das Anfrage Post-Filter und querystrings Injektionsorientierte Symbole und nicht die Anforderung, bevor es sogar die Anwendung trifft. Die meisten dieser Lösungen spezifischen IIS 6 oder höher. Ich renne 5.
  2. Garantie, dass jeder Befehl Objekt läuft nur einen einzelnen SQL-Befehl zu einem Zeitpunkt.

Jede andere Ideen für meine Konfiguration?

Veröffentlicht am 09/12/2008 um 21:41
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
1

Immer sanieren Benutzereingabe

  1. wenn Sie nicht zulässig "würden Sie sofort in gewisser Weise zu machen Ihren Code sicherer
  2. Wenn Ihre Abfrage eine ganze Zahl erwartet, stellen Sie sicher, dass die Eingabe eine ganze Zahl ist. etc
Beantwortet am 07/03/2009 um 13:27
quelle vom benutzer

stimmen
1

Wenn ich auf meinem Server ein Bündel von Injection-Angriff versucht hatte, war ich besorgt, dass sie unnötig Ressourcen Aufnahme wurden. Ich schrieb (gehackt!) Ein Httpmodule in c #, dass die meisten XSS und SQL-Injection-Angriffe würden herauszufiltern. Der Code wird unten eingefügt, zusammen mit dem Konfigurationsabschnitt erforderlich ist, um eine Website zu machen verwenden. Es sollte in einem Projekt und kompiliert WebSecurityFilter.dll gestellt werden, die dann durch das Web-Projekt (oder auf andere Weise fallen gelassen in das bin-Verzeichnis) verwiesen werden soll.

Dies wird nur mit asp.net arbeiten, so dass hoffentlich Ihre Website asp.net basiert (ich habe in einem Kommentar fragen, bekam aber keine Antwort).

Web-Config Abschnitt (fügen Sie es im <Httpmodules> Abschnitt <system.web>:

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

Code für das Modul (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
    }
}

Hoffentlich ist es alles in Ordnung formatiert ...

Ich werde versuchen, an diesem Abend einen Link auf das gesamte Projekt in einer Zip zu posten.

Beantwortet am 09/12/2008 um 22:34
quelle vom benutzer

stimmen
1

Stellen Sie sicher, dass alle Ihre Datenbank Anrufe entweder gespeicherte Prozeduren oder parametrisierte Abfragen.

Beantwortet am 09/12/2008 um 22:08
quelle vom benutzer

stimmen
1

Diese vorgeschlagene Lösung:

Garantie, dass jeder Befehl Objekt läuft nur einen einzelnen SQL-Befehl zu einem Zeitpunkt.

nicht wirklich Injektion verhindern. Zum Beispiel kann eine Login-Abfrage von einem Angreifer injiziert werden, ohne dass Anmeldeinformationen anmelden. Erwägen:

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

Diese Vorlage kann mit einer Benutzer-ID von injiziert werden:

' OR 1=1 --

Ausbeute:

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

Konzentrieren Sie Ihre Bemühungen auf die Verwundbarkeit aus dem Code zu beseitigen.

Beantwortet am 09/12/2008 um 21:56
quelle vom benutzer

stimmen
1

Es gibt keine automatische Lösung gegen SQL-Injektion im Allgemeinen zu schützen. SQL-Injection ist ein Anwendungsfehler, kein Datenbankfehler.

Die Lösung ist für Sie Code-Überprüfung aller Fälle zu tun, wo Sie SQL ausführen, die Anwendungsdaten in die Abfrage interpoliert.

Beantwortet am 09/12/2008 um 21:49
quelle vom benutzer

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