Предположим, пользователю-злоумышленнику удалось узнать об уязвимости. В таком случае ничто не мешает ему ввести в строку поиска следующий текст:
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. Резервное копирование и восстановление баз данных
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.