Безопасность в Silverlight 2 - Правила наследования
ОГЛАВЛЕНИЕ
Правила наследования
Для эффективной работы модели прозрачности необходимо убедиться в том, что замыкание типа или метода безопасно так же, как и сам тип или метод. Если в результате наследования дочерние типы и методы получают права доступа к ресурсам, отличающиеся от прав доступа базовых типов и методов, то защита доступа к ресурсам может быть нарушена. Особенно опасна ситуация, когда унаследованный тип, имеющий ограниченные права доступа к ресурсам, преобразуется к базовому типу или интерфейсу с более широкими правами доступа. Представьте себе, что прозрачный виртуальный метод переопределяется методом с ключевым кодом, а для предотвращения вызов переопределенного метода из прозрачного кода выполняется преобразование к Object.ToString.
В иерархии полномочий и прав доступа уровней прозрачности права доступа становятся более ограниченными, а полномочия более широкими при перемещении от прозрачного кода к безопасному ключевому и далее к ключевому коду. (В данном случае правом доступа называется как возможность содержать в себе, так и возможность вызывать код соответствующей категории безопасности). Правило наследования для типов заключается в том, что у унаследованных типов должны быть, по меньшей мере, такие же ограничения, как и у базовых. Выполнение этого правила предотвращает ненамеренное переопределение методов, вызываемых из прозрачного кода, методами, исполняющими ключевой код. На рис. 1 показано, какое наследование допускается в соответствии с этим правилом.
Базовый тип | Разрешенный производный тип |
---|---|
Прозрачный | Прозрачный, безопасный ключевой и ключевой. |
Безопасный ключевой | Безопасный ключевой, ключевой |
Ключевой | Ключевой |
Переопределение виртуальных методов подчиняется другому правилу: из прозрачного кода производный метод должен иметь те же права доступа, что и базовый метод. На рис. 2 показано, какое наследование допускается в соответствии с этим правилом.
Базовый виртуальный метод или интерфейс | Разрешенные переопределения метода |
---|---|
Прозрачный | Прозрачный, безопасный ключевой |
Безопасный ключевой | Прозрачный, безопасный ключевой |
Ключевой | Ключевой |
Заметьте, что не разрешается переопределять ключевыми прозрачные виртуальные методы, потому что при таком переопределении можно обойти проверку на ключевой метод. Достаточно просто преобразовать переопределенный метод к базовому и вызвать его. Переопределять прозрачные функции безопасными ключевыми можно потому, что даже преобразование ни к чему не приведет: прозрачный код и так может вызывать безопасный ключевой. Безопасные ключевые методы можно переопределять прозрачными — на первый взгляд, это может показаться неожиданным, но такое переопределение безопасно, потому что и в этом случае преобразованием типов нельзя получить несанкционированный доступ.
В заключение можно сказать, что в модели прозрачности Silverlight любой код по умолчанию считается прозрачным. Все приложения Silverlight совершенно прозрачны. Игнорируюся любые пометки, указывающие на обратное. Кроме того, наличие предопределенного набора прав означает, что единственным необходимым для CoreCLR механизмом является механизм прозрачности. На рис. 3 приведены все три категории кода, их свойства и возможности.
Рис. 3. Сравнение прозрачного, безопасного ключевого и ключевого кода
Прозрачный | Безопасный ключевой | Ключевой | |
---|---|---|---|
Ограничения доступа | Не может напрямую вызывать ключевой код. | Разрешены все функции, разрешенные ключевому коду. Необходимо выполнять соответствующие проверки до и после вызова ключевого кода. | Является привилегированным и может вызывать код любой категории. Эквивалентен только полностью проверенному коду. Не может быть вызван из прозрачного кода, но может быть доступен посредством безопасного ключевого кода. |
Небезопасный код | В нем не должно содержаться небезопасного или непроверяемого кода. | Может содержаться небезопасный или непроверяемый код. | Может содержаться небезопасный или непроверяемый код. |
Доступность для приложений и функций системы | Находится как в приложениях, так и в коде системы. | Доступен только для сборок системы Silverlight. | Доступен только для сборок системы Silverlight. |
Наследование типов | Типы должны происходить от других прозрачных типов. | Типы должны происходить от других прозрачных или безопасных ключевых типов. | Типы могут происходить от любых типов. |
Переопределение методов | Методы должны переопределять прозрачные или безопасные ключевые виртуальные методы или интерфейсы. | Методы должны наследоваться от прозрачных или безопасных ключевых виртуальных методов или интерфейсов. | Методы должны происходить от критических виртуальных методов или интерфейсо |