2008-12-09 2 views
1

Я работаю с SQL Server 2005 и Windows Server 2000 и задаюсь вопросом, есть ли какие-либо «автоматические» способы блокировки атак SQL Injection, когда я поддерживаю свой код.Решения на базе SQL или SQL Server для SQL-инъекций

Некоторые предположили, что есть способы:

  1. Введена в какой-то ISAPI или HTTP модуль, который фильтрует запрос пост и querystrings для инжекторных-ориентированных символов и не запрос, прежде чем он даже попадает в приложение. Большинство из этих решений составляют IIS 6 или выше. Я бегу 5.
  2. Гарантируйте, что каждый объект команды запускает только одну команду SQL за раз.

Любые другие идеи для моей конфигурации?

+0

На каком языке написано оскорбительное приложение? – 2008-12-09 20:50:36

ответ

1

Когда у меня была нагрузка на сервер, я был обеспокоен тем, что они занимают ненужные ресурсы. Я написал (взломал!) HttpModule в C#, который отфильтровывал бы большинство атак xss и sql. Ниже приведен код, а также раздел конфигурации, необходимый для использования веб-сайтом. Он должен быть помещен в проект и скомпилирован в файл WebSecurityFilter.dll, который затем должен ссылаться на веб-проект (или иначе удаляться в каталоге bin).

Это будет работать только с asp.net, поэтому, надеюсь, ваш сайт основан на asp.net (я просил в комментарии, но не получил ответа).

Web конфигурации раздела (добавьте его в разделе <system.web> <HttpModules>:

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

Надеюсь, все в порядке ... отформатирован

Постараюсь разместить ссылку на полный проект в молнии в этот вечер.

+0

Примечание: если кто-либо проверяет это, и у них был старый компьютер Amiga, сообщение об ошибке может быть немного знакомым. – 2008-12-09 21:52:53

1

Автоматическое решение для защиты от SQL-инъекций в целом отсутствует. SQL-инъекция - это ошибка приложения, а не ошибка базы данных.

Решение предназначено для просмотра кода обо всех случаях, когда вы выполняете SQL, который интерполирует данные приложения в запрос.

1

Это предлагаемое решение:

гарантия, что каждый объект команды работает лишь одной команды SQL в виде времени.

фактически не предотвращает инъекцию. Например, запрос входа в систему может быть введен злоумышленником для входа в систему без учетных данных. Рассмотрим:

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

Этот шаблон может быть введен с UserId из:

' OR 1=1 -- 

Уступая:

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

Сосредоточить усилия на устранение уязвимости от кода.

1

Убедитесь, что все вызовы в базе данных используют хранимые процедуры или параметризованные запросы.

1

Всегда дезинфицировать ввод данных пользователем

  1. , если запрещен "вы сразу же каким-то образом, чтобы сделать код более безопасным
  2. , если ваш запрос ожидает целое число, убедитесь, что вход является целым числом. и т. Д.

 Смежные вопросы

  • Нет связанных вопросов^_^