19 смертных грехов, угрожающих безопасности программ. Майкл Ховард. Читать онлайн. Newlib. NEWLIB.NET

Автор: Майкл Ховард
Издательство:
Серия:
Жанр произведения: Программирование
Год издания: 0
isbn: 5-9706-0027-X
Скачать книгу
или вообще нет никакого ответа.

      Имеются также инструменты третьих фирм, например AppScan компании Sanctum (теперь Watchfire) (www.watchfire.com), Weblnspect компании SPI Dynamics (www.spidynamics.com) и ScanDo компании Kavado (www.kavado.com).

      Для оценки инструмента рекомендуем создать небольшое тестовое приложение с известными ошибками, допускающими внедрение SQL, и посмотреть, какие ошибки этот инструмент сумеет найти.

      Примеры из реальной жизни

      Следующие примеры внедрения SQL–команд взяты из базы данных CVE (http://cve.mitre.org).

      CAN–2004–0348

      Цитата из бюллетеня CVE: «Уязвимость, связанная с внедрением SQL в сценарии viewCart.asp из программного обеспечения корзины для покупок компании SpiderSales, позволяет удаленному противнику выполнить произвольный SQL–запрос, воспользовавшись параметром userld».

      Многие сценарии в программах SpiderSales не проверяют параметр userld, и этим можно воспользоваться для проведения атаки с внедрением SQL. Успешная атака позволяет противнику получить доступ к интерфейсу администратора SpiderSales и прочитать любую информацию из базы данных электронного магазина.

      CAN–2002–0554

      Цитата из бюллетеня CVE: «Модуль IBM Informix Web DataBlade 4.12 позволяет удаленному противнику обойти контроль доступа и прочитать произвольный файл путем атаки с внедрением SQL через HTTP–запрос».

      Модуль Web DataBlade для базы данных Informix SQL динамически генерирует HTML–страницу на основе данных. Уязвимость отмечена в нескольких версиях Web DataBlade. Можно внедрить SQL–команды в любой запрос, обрабатываемый этим модулем. Результатом может стать раскрытие секретной информации или повышение уровня доступа к базе данных.

      Искупление греха

      Простейший и наиболее безопасный способ искупления – никогда не доверять входным данным, на основе которых формируется SQL–запрос, и пользоваться подготовленными или параметризованными предложениями (prepared statements).

      Проверяйте все входные данные

      Займемся для начала первой рекомендацией: никогда не доверять входным данным. Следует всегда проверять, что данные, подставляемые в SQL–предложение, корректны. Если вы работаете на языке достаточно высокого уровня, то проще всего воспользоваться для этого регулярным выражением.

      Никогда не применяйте конкатенацию для построения SQL–предложений

      Следующая рекомендация состоит в том, чтобы никогда не строить SQL–предложения посредством конкатенации или замены подстроки. Никогда! Пользуйтесь только подготовленными или параметризованными запросами. В некоторых технологиях это называется связыванием параметров (binding). В примерах ниже продемонстрированы некоторые из таких безопасных конструкций.

      Примечание. Во всех примерах информация о параметрах соединения не хранится в тексте программы; мы вызываем специальные функции, которые считывают данные из пространства приложения.

      Искупление греха в С#

      public string Query(string Id) {

      string ccnum;

      string sqlstring = "";

      // пропускаем только корректные ID (от 1 до 8 цифр)

      Regex r = new Regex(@"^\d{1,8}$");

      if (!r.Match(Id).Success)

      throw new Exception("Неверный ID. Попробуйте еще раз.");

      try {

      SqlConnection sqlConn = new SqlConnection(GetConnection);

      string str = "sp_GetCreditCard";

      cmd = new SqlCommand(str, sqlConn);

      cmd.CommandType = CommandType.StoredProcedure;

      cmd.Parameters.Add("@ID", Id);

      cmd.Connection.Open();

      SqlDataReader read = myCommand.ExecuteReader();

      ccnum = read.GetString(0);

      }

      catch (SqlException se) {

      throw