Spec-Zone .ru
спецификации, руководства, описания, API
|
Сохраненные программы и представления определяются до использования и, когда ссылающийся, выполняются в пределах
контекста защиты, который определяет их полномочия. Этими полномочиями управляет их DEFINER
атрибут, и, если есть один, их SQL SECURITY
характеристика.
У всех сохраненных программ (процедуры, функции, триггеры, и события) и представления может быть a DEFINER
атрибут, который называет учетную запись MySQL. Если DEFINER
атрибут опускается из сохраненной программы или определения представления, учетная запись значения по умолчанию
является пользователем, который создает объект.
Кроме того, у сохраненных подпрограмм (процедуры и функции) и представления может быть a SQL
SECURITY
характеристика со значением DEFINER
или INVOKER
определить, выполняется ли объект в устройстве определения или invoker контексте. Если SQL
SECURITY
характеристика опускается, значение по умолчанию является контекстом устройства определения.
Триггеры и события имеют нет SQL SECURITY
характеристика и всегда выполняется в
контексте устройства определения. Сервер вызывает эти объекты автоматически по мере необходимости, таким образом
нет никакого пользователя вызова.
Устройство определения и invoker контексты защиты отличаются следующим образом:
Сохраненная программа или представление, которое выполняется в контексте защиты
устройства определения, выполняются с полномочиями учетной записи, названной DEFINER
атрибут. Эти полномочия могут полностью отличаться от таковых из пользователя вызова. У invoker должны
быть соответствующие полномочия сослаться на объект (например, EXECUTE
вызывать хранимую процедуру или SELECT
чтобы выбрать из представления), но когда объект выполняется,
полномочия invoker игнорируются и только DEFINER
вопрос полномочий учетной
записи. Если у этой учетной записи есть немного полномочий, объект соответственно ограничивается в
операциях, которые это может выполнить. Если DEFINER
учетная запись
чрезвычайно привилегирована (такие как a root
учетная запись), объект может
выполнить мощные операции независимо от того, кто вызывает это.
Сохраненная подпрограмма или представление, которое выполняется в invoker контексте
защиты, могут выполнить только операции, для которых у invoker есть полномочия. DEFINER
атрибут может быть определен, но не имеет никакого эффекта для объектов, которые выполняются в invoker
контексте.
Рассмотрите следующую хранимую процедуру:
CREATE DEFINER = 'admin'@'localhost' PROCEDURE p1()SQL SECURITY DEFINERBEGIN UPDATE t1 SET counter = counter + 1;END;
Любой пользователь, который имеет EXECUTE
полномочие для p1
может вызвать это с a CALL
оператор. Однако, когда p1
выполняется, это
делает так в DEFINER
контекст защиты и таким образом выполняется с полномочиями
'admin'@'localhost'
, учетная запись, названная в DEFINER
атрибут. Эта учетная запись должна иметь EXECUTE
полномочие для p1
так же как UPDATE
полномочие для
таблицы t1
. Иначе, сбои процедуры.
Теперь рассмотрите эту хранимую процедуру, которая идентична p1
за исключением
того, что SQL SECURITY
характеристика INVOKER
:
CREATE DEFINER = 'admin'@'localhost' PROCEDURE p2()SQL SECURITY INVOKERBEGIN UPDATE t1 SET counter = counter + 1;END;
p2
, в отличие от этого p1
, выполняется в INVOKER
контекст защиты. DEFINER
атрибут не важен и
p2
выполняется с полномочиями пользователя вызова. p2
сбои, если invoker недостает EXECUTE
полномочие для p2
или UPDATE
полномочие для таблицы t1
.
MySQL использует следующие правила управлять, какие учетные записи пользователь может определить в объекте DEFINER
атрибут:
Можно определить a DEFINER
оцените кроме своей
собственной учетной записи, только если Вы имеете SUPER
полномочие.
Если Вы не имеете SUPER
полномочие, единственное юридическое пользовательское значение
является Вашей собственной учетной записью, или определенной буквально или при использовании CURRENT_USER
. Невозможно установить устройство определения в
некоторую другую учетную запись.
Чтобы минимизировать потенциал риска для сохраненной программы и создания представления и использовать, следуйте за этими направляющими линиями:
Для сохраненной подпрограммы или представления, использовать SQL
SECURITY INVOKER
в объектном определении, когда возможный так, чтобы это могло использоваться
только пользователями с полномочиями, подходящими для операций, выполняемых объектом.
Если Вы создаете контекст устройства определения сохраненные программы или
представления, используя учетную запись, которая имеет SUPER
полномочие, определите явное DEFINER
атрибут, который называет учетную запись, обладающую только
полномочиями требуемый для операций выполняемый объектом. Определите чрезвычайно привилегированный DEFINER
считайте только когда абсолютно необходимый.
Администраторы могут препятствовать тому, чтобы пользователи определили чрезвычайно
привилегированный DEFINER
учетные записи, не предоставляя им SUPER
полномочие.
Объекты контекста устройства определения должны быть записаны, имея в виду, что они могут быть в состоянии получить доступ к данным, для которых у пользователя вызова нет никаких полномочий. В некоторых случаях можно предотвратить ссылку на эти объекты, не предоставляя неавторизованным пользователям определенные полномочия:
Однако, никакое такое управление не существует для триггеров, потому что пользователи не ссылаются
на них непосредственно. Триггер всегда выполняется в DEFINER
контекст и
активируется доступом к таблице, с которой это связывается, даже обычные табличные доступы
пользователями без специальных полномочий. Если DEFINER
учетная запись
чрезвычайно привилегирована, триггер может выполнить чувствительные или опасные операции. Это
остается истиной если SUPER
и TRIGGER
полномочия должны были создать триггер, отменяются из
учетной записи пользователя, который создал это. Администраторы должны быть особенно осторожными
относительно предоставления пользователям та комбинация полномочий.