2008-12-09 4 views
1

Je travaille avec SQL Server 2005 et Windows Server 2000 et je me demande s'il existe des moyens «automatisés» de bloquer les attaques par injection SQL pendant que je consolide mon code.Solutions HTTP ou SQL Server pour l'injection sql

Certains ont suggéré qu'il existe des moyens pour:

  1. Mettre dans une sorte de module ISAPI ou HTTP qui filtre demande après et querystrings pour les symboles orientés par injection et ne la demande avant qu'elle ne touche même l'application. La plupart de ces solutions sont spécifiques à IIS 6 ou supérieur. Je cours 5.
  2. Garantissez que chaque objet de commande n'exécute qu'une seule commande SQL à la fois.

D'autres idées pour ma configuration?

+0

Quelle est la langue dans laquelle l'application incriminée est écrite? –

Répondre

1

Lorsque j'ai eu un tas de tentatives d'attaques par injection sur mon serveur, j'étais inquiet qu'ils prennent des ressources inutiles. J'ai écrit (hacké!) Un HttpModule dans C# qui filtrerait la plupart des attaques par injection xss et sql. Le code est collé ci-dessous, avec la section de configuration requise pour qu'un site Web l'utilise. Il devrait être mis dans un projet et compilé à WebSecurityFilter.dll, qui devrait alors être référencé par le projet web (ou sinon déposé dans le répertoire bin).

Cela fonctionnera uniquement avec asp.net, donc j'espère que votre site est basé sur asp.net (j'ai demandé dans un commentaire, mais je n'ai pas eu de réponse).

section de configuration Web (ajoutez dans la <httpModules> section de <system.web>:

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

code pour le module (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\[email protected]\w+))", _defaultRegexOptions, "SQL 4"), //2.4 
      new RegexWithDesc(@"exec(((\s|\+)+(s|x)p\w+)|(\[email protected]))", _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 
    } 
} 

Espérons que tout au format correct ...

Je vais essayer de poster un lien vers le projet complet dans un zip ce soir.

+0

Note: si quelqu'un le teste et qu'il avait un vieil ordinateur Amiga, alors le message d'erreur peut être un peu familier. –

1

Il n'existe pas de solution automatique pour protéger contre l'injection SQL en général. L'injection SQL est une erreur d'application, pas une erreur de base de données.

La solution consiste à effectuer une révision de code de tous les cas où vous exécutez SQL qui interpole les données d'application dans la requête.

1

Cette solution proposée:

garantie que chaque objet de commande exécute une seule commande SQL à un moment .

n'empêche pas réellement l'injection. Par exemple, une requête de connexion peut être injectée par un attaquant pour se connecter sans informations d'identification. Tenir compte:

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

Ce modèle peut être injecté avec une UserId de:

' OR 1=1 -- 

Cédant:

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

vos efforts sur Concentrez éliminant la vulnérabilité du code.

1

Assurez-vous que tous vos appels de base de données utilisent des procédures stockées ou des requêtes paramétrées.

1

si vous sur Rejeté 'vous immédiatement désinfectez toujours l'entrée d'utilisateur

  1. une certaine façon à rendre votre code plus sûr
  2. si votre requête attend un entier, assurez-vous que l'entrée est un entier. etc