Скачиваний:
42
Добавлен:
01.04.2014
Размер:
539.65 Кб
Скачать

15.4. Модификация запроса

Для иллюстрации некоторых представленных выше идей следует описать аспекты безопасности, реализованные с помощью достаточно интересного подхода [15.16] в системе INGRES на основе языка QUEL. В общем, любой запрос на языке QUEL пе­ред исполнением автоматически модифицируется таким образом, чтобы не смог на­рушить ни одного правила безопасности. В качестве примера предположим, что пользователю U разрешено извлекать данные только о товарах, размещенных в Лон­доне, с помощью следующего правила:

DEFINE PERMIT RETRIEVE ON Р ТО U

WHERE P.CITY = "London"

(Оператор DEFINE PERMIT будет подробно описан ниже.) Теперь предположим, что пользователь U задает приведенный ниже запрос на языке QUEL:

RETRIEVE ( Р.Р#, Р.WEIGHT )

WHERE P. COLOR = "Red"

Используя "разрешение" (директива PERMIT) на извлечение комбинации отношения Р и пользователя U в том виде, в каком они сохраняются в каталоге, в системе INGRES при­веденный выше запрос автоматически модифицируется следующим образом:

RETRIEVE ( Р.Р#, .WEIGHT ) WHERE P.COLOR = "Red"

AND P.CITY = "London"

Конечно, этот модифицированный запрос вряд ли сможет нарушить заданное пра­вило безопасности. Обратите внимание, что процесс модификации прошел достаточно "незаметно", т.е. пользователь U не был проинформирован о том, что система фактиче­ски выполнила запрос, который несколько отличается от исходного. Дело в том, что со­крытие такой информации может быть намеренным (например, пользователю U не сле­дует знать о том, что существуют некоторые товары, не хранящиеся в Лондоне).

Описанный в краткой форме процесс "модификации запроса" полностью идентичен методу, используемому для воплощения представлений. Таким образом, данную методи­ку достаточно просто воплотить в основном благодаря тому, что необходимый для этого код уже присутствует в системе. Другое ее преимущество — сравнительно высокая эф­фективность, так как появление накладных расходов (по крайней мере, некоторой их части), связанных с обеспечением мер безопасности, происходит во время компиляции, а не во время выполнения программы (здесь предполагается, что система является компи­лируемой). Еще одно преимущество этой методики состоит в том, что при работе с ней не возникает никаких неудобств, присущих подходу на основе языка SQL, когда для данного пользователя следует задать разные привилегии при обращении к разным частям данных одного и того же отношения (об этом речь будет идти ниже в этой главе).

Недостаток этой методики заключается в том, что не всем правилам безопасности можно придать такую простую форму. В качестве простейшего обратного примера. Предположим, что пользователюUне разрешен допуск к отношению Р. Тогда ника­кая простая "модифицированная" форма приведенного выше правила извлечения не будет избавлена от иллюзии, что отношения Р не существует. Наоборот, обязательно появится сообщение об ошибке приблизительно следующего содержания: "Вам не разрешен доступ к данному отношению".

В общем виде правила безопасности на языке QUEL формулируются с помощью синтаксиса на основе директивы DEFINE PERMIT:

DEFINE PERMIT список_операторов_через_запятую

ON отношение [ (список_ атрибутов_ через_ запятую) ]

ТО пользователь

[ AT терминалы ]

[ FROM время ТО время]

[ ON день ТО день ]

[ WHERE условие ]

Таким образом, правило DEFINE PERMIT очень похоже на правило CREATE SECURITY RULE за исключением того, что вместо простого использования условий в директиве WHERE для контекстно-зависимого управления (например, для времени и даты) добавлены особые синтаксические директивы. Ниже приводится пример пра­вила, построенного согласно заданному синтаксису:

DEFINE PERMIT APPEND, RETRIEVE, REPLACE

ON S ( SNAME, CITY)

TO Joe

AT TTA4

FROM 9:00 TO 17:30

ON Sat TO Sun

WHERE S. STATUS < 50

AND S.S# = SP.P#

AND SP.P# = P.P#

AND P. COLOR = "Red"

Операторы добавления APPEND и замены REPLACE аналогичны директивам вставки INSERT и обновления UPDATE соответственно.

Правила безопасности сохраняются в каталоге системы INGRES под числовыми идентификаторами (например, 0, 1, 2 и т.д.). Эти идентификаторы можно обнаружить с помощью запроса к каталогу (для получения помощи предусмотрена специальная справочная команда HELP, хотя вместо нее может также использоваться обычный оператор извлечения RETRIEVE языка QUEL). Для устранения приведенного выше правила необходимо также прежде всего указать соответствующий идентификатор. Например, для идентификатора 27 это правило безопасности может быть устранено с помощью следующего утверждения:

DESTROY PERMIT S 27

Соседние файлы в папке Дейтл Введ в БД