Требования связывания
Требование связывания происходит при 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.
}
См. также
Основные понятия
Расширение метаданных с помощью атрибутов
Создание собственных разрешений доступа к коду