Введение в дисциплину «Безопасность систем баз данных». Теоретические основы построения реляционных баз данных. Верификация баз данных и проведение аудита в СБД. Распределенные базы данных, страница 59

Предположим, пользователю-злоумышленнику удалось узнать об уязвимости. В таком случае ничто не мешает ему ввести в строку поиска следующий текст:

abracadabra’ union select name from sysobjects where xtype = ‘U’ --

Казалось бы, факультета с таким названием в БД наверняка не существует, поэтому список кафедр будет пустым. Однако при более внимательном рассмотрении выясняется, что в данном случае злоумышленник ввел не параметр поиска, а некую часть запроса. В результате слияния неизменяемой и изменяемой части получается следующий запрос:

select ch_name

from faculties_chairs

where fac_name = ‘abracadabra’

union

select name

from sysobjects

where xtype = ‘U’ --‘

В результирующий набор не попадет ни одна кафедра, так как факультета с названием ‘abracadabra’ не существует. Зато пользователь увидит перечень имен пользовательских таблиц БД вместо перечня кафедр. Такой эффект явно не предусматривался разработчиком при создании приложения.

С целью предупреждения подобного рода атак программистам рекомендуется придерживаться следующих правил.

1. Доступ приложений к данным должен быть ограниченным. Для связи с БД приложение должно либо запрашивать у пользователя учетную запись, либо использовать роль приложения, заранее созданную на сервере.

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

3. Ручной ввод должен применяться в ситуациях, когда он действительно необходим. В приведенном выше примере вместо ручного ввода названия факультета удобнее и безопаснее было бы использовать выбор факультета в таблице (списке).

4. Там, где трудно применим статический (неизменяемый) запрос, рекомендуется использовать динамический запрос. Например:

QueryDataSet->CommandText = "select ch_name as Название from faculties_chairs where fac_name = :p_fac_name";

Здесь p_fac_name – изменяемый параметр запроса, который автоматически будет занесен в список Parameters, являющийся свойством объекта QueryDataSet. Впоследствии значение этого параметра можно модифицировать:

QueryDataSet->Parameters->ParamByName[“p_fac_name”]->Value = QueryEdit->Text;

Будет изменено именно значение параметра, а не текст запроса.


7. Методы и механизмы обеспечения доступности баз данных и СУБД

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

Если говорить о системах баз данных, то к факторам, отрицательно влияющим на доступность информации в них, следует отнести:

·  повреждение файлов данных;

·  отказ серверного программного обеспечения СУБД;

·  физическое повреждение носителей информации.

На практике никто не застрахован от отказа оборудования или программного сбоя. С другой стороны, к целому ряду информационных систем сегодня предъявляется требование непрерывной работы – чтобы авторизованные пользователи могли получить любые интересующие их сведения, в любое время. Для обеспечения максимальной отказоустойчивости системы не обойтись без резервирования. Для обеспечения отказоустойчивости баз данных применяется резервное копирование данных и журналов транзакций. Для повышения отказоустойчивости СУБД – резервирование серверов СУБД и использование дисковых массивов в качестве информационных носителей.

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

7.1. Резервное копирование и восстановление баз данных