Требования связывания
Обновлен: Ноябрь 2007
Требование связывания происходит при JIT-компиляции и проверяет только непосредственно вызывающий код. Связывание происходит, когда ваш код привязывается к ссылке на тип, включая ссылки на указатели функций и вызовы методов. Если вызывающая сборка не имеет достаточных разрешений для связывания с кодом, связывание не разрешается, и при загрузке и запуске кода создается исключение во время выполнения. Требования связывания могут переопределяться в классах, наследующих код.
Следует принять во внимание, что при выполнении этого типа требования не происходит полной проверки стека и код остается восприимчивым к отвлекающим атакам. Например, если метод в сборке А защищен требованием связывания, непосредственный вызывающий объект в сборке Б оценивается на основании разрешений сборки Б. Однако требование связывания не будет оценивать метод в сборке В, если он косвенно вызывает метод в сборке А посредством метода в сборке Б. Требование связывания определяет только те разрешения, которыми должны обладать непосредственные вызывающие объекты в непосредственно вызывающей сборке для связывания с кодом. Оно не определяет, какие разрешения должны иметь все вызывающие объекты для запуска кода.
Модификаторы проверки стека Assert, Deny и PermitOnly не влияют на оценку требований связывания. Поскольку требования связывания не производят проверку стека, модификаторы проверки стека не оказывают влияния на требования связывания.
Если к методу, защищенному требованием связывания, производится доступ посредством отражения, то требование связывания проверяет непосредственный вызывающий объект кода, доступ к которому осуществляется через отражение. Это верно как при выполнении поиска метода, так и при его вызове через отражение. Например, код использует отражение для возврата объекта MethodInfo, предоставляющего метод, защищенный требованием связывания, а затем передает этот объект MethodInfo какому-либо другому коду, который использует этот объект для вызова исходного метода. В этом случае проверка требования связывания происходит дважды: один раз для кода, возвращающего объект MethodInfo, и еще раз для кода, вызывающего его.
Примечание. |
---|
Требование связывания, выполняемое над статическим конструктором класса, не защищает конструктор, так как статические конструкторы вызываются системой отдельно от пути выполнения кода приложения. В результате, если требование связывания применяется ко всему классу, оно не может предотвратить доступ к статическому конструктору, хотя защищает остальную часть класса. |
В следующем фрагменте кода декларативно указывается, что любой код, связываемый с методом ReadData, должен иметь разрешение CustomPermission. Это разрешение — гипотетическое, его не существует в .NET Framework. Это требование осуществляется передачей атрибуту CustomPermissionAttribute флага SecurityAction.LinkDemand.
<CustomPermissionAttribute(SecurityAction.LinkDemand)> _
Public Shared Function ReadData() As String
' Access a custom resource.
End Function
[CustomPermissionAttribute(SecurityAction.LinkDemand)]
public static string ReadData()
{
// Access a custom resource.
}
См. также
Основные понятия
Создание собственных разрешений доступа к коду
Добавление поддержки декларативной безопасности