HTTP или SQL Серверные решения на основе для 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

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

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

Веб-конфигурации раздела (добавьте его в разделе <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}'"

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

' 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