λύσεις HTTP ή SQL Server που βασίζεται για τον SQL ένεση

ψήφοι
1

Δουλεύω με τον SQL Server 2005 και Windows Server 2000 και αναρωτιέμαι αν υπάρχουν «αυτοματοποιημένη» τρόπους για να μπλοκάρει τις επιθέσεις SQL Injection, ενώ εγώ καλύψουμε τον κωδικό μου.

Μερικοί έχουν προτείνει ότι υπάρχουν τρόποι για να:

  1. Βάλτε σε κάποιο είδος ISAPI ή HTTP μονάδα η οποία φιλτράρει το αίτημα των υστέρων και querystrings για τα σύμβολα ένεση προσανατολισμένη και δεν την αίτηση προτού να χτυπήσει ακόμη και την εφαρμογή. Οι περισσότερες από αυτές τις συγκεκριμένες λύσεις IIS 6 ή νεότερη έκδοση. Τρέχω 5.
  2. Εγγύηση ότι κάθε αντικείμενο εντολή εκτελεί μία μόνο εντολή SQL σε μια στιγμή.

Οποιεσδήποτε άλλες ιδέες για διαμόρφωση μου;

Δημοσιεύθηκε 09/12/2008 στις 21:41
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
1

Πάντα αποστείρωση είσοδο του χρήστη

  1. αν αρθεί », που θα πάει αμέσως κάποιο τρόπο για να κάνουν τον κωδικό σας ασφαλέστερο
  2. εάν το ερώτημά σας περιμένει έναν ακέραιο, βεβαιωθείτε ότι εισόδου είναι ένας ακέραιος. και τα λοιπα
Απαντήθηκε 07/03/2009 στις 13:27
πηγή χρήστη

ψήφοι
1

Όταν είχα ένα σωρό απόπειρες επίθεσης ένεση στον server μου, ήμουν ανησυχούν ότι έπαιρναν μέχρι περιττές πόρους. Έγραψα (hacked!) Ένα HttpModule σε C # που θα φιλτράρει τα περισσότερα XSS και SQL ένεση επιθέσεις. Ο κώδικας έχει επικολληθεί στη συνέχεια, μαζί με το τμήμα ρυθμίσεων που απαιτούνται για να κάνει μια ιστοσελίδα να το χρησιμοποιήσετε. Θα πρέπει να τεθεί σε ένα έργο και να καταρτίζονται σε WebSecurityFilter.dll, η οποία θα πρέπει στη συνέχεια να αναφέρεται από το έργο web (ή αλλιώς έπεσε στον κατάλογο bin).

Αυτό θα λειτουργήσει μόνο με asp.net, οπότε ελπίζω το site σας βασίζεται asp.net (Είχα ζητήσει σε ένα σχόλιο, αλλά δεν πήρε καμία απάντηση).

το τμήμα Web 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

Βεβαιωθείτε ότι όλες οι κλήσεις βάση δεδομένων σας χρησιμοποιεί είτε αποθηκευμένες διαδικασίες ή παραμετροποιημένη ερωτήματα.

Απαντήθηκε 09/12/2008 στις 22:08
πηγή χρήστη

ψήφοι
1

Η προτεινόμενη λύση:

Εγγύηση ότι κάθε αντικείμενο εντολή εκτελεί μία μόνο εντολή SQL σε μια στιγμή.

δεν εμποδίζει στην πραγματικότητα ένεση. Για παράδειγμα, ένα ερώτημα σύνδεσης μπορεί να εγχυθεί από έναν εισβολέα να συνδεθεί χωρίς διαπιστευτήρια. Σκεφτείτε:

"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

Δεν υπάρχει αυτόματη λύση για την προστασία από την ένεση SQL σε γενικές γραμμές. SQL ένεση είναι ένα σφάλμα εφαρμογής, δεν είναι ένα σφάλμα βάσης δεδομένων.

Η λύση είναι για σας να κάνετε ανασκόπηση κώδικας όλες τις περιπτώσεις που εκτελεί τον SQL που παρεμβάλλει τα δεδομένα της εφαρμογής στο ερώτημα.

Απαντήθηκε 09/12/2008 στις 21:49
πηγή χρήστη

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