Как пометить сборку как "безопасную"?
Вы думаете об этом неправильно.
Кто-то, кто, по вашему мнению, возможно, хочет убить вас, протягивает вам бутылку и говорит: «Выпей это». Вы говорите "это безопасно пить?" Парень говорит «прочти бутылку». Ты сделаешь. На нем написано "БЕЗОПАСНО ПИТЬ".
Вы пьете это?
Является ли жидкость безопасной для питья или нет, не имеет никакого отношения к тому, что написано на этикетке бутылки! Вполне возможно положить бензин в бутылку с надписью «БЕЗОПАСНО ПИТЬ».
Вы парень, раздающий бутылку с подозрительной жидкостью серверу SQL , и SQL Server говорит: «Я не доверяю ни одной метке, которую вы собираетесь поставить на эту сборку». Скорее, это сделает сборку «безопасной», ограничив возможности сборки. Он блокирует разрешения для этой вещи, так что любая попытка вашей сборки использовать SQL-сервер приведет к ее завершению через исключение.
Как узнать, что в моей сборке что-то не "безопасно"?
Попробуйте запустить его с низким уровнем доверия. Он рухнул и умер за исключением безопасности? Если ответ «да», то это не безопасно в соответствии с этим уровнем доверия . Различные уровни доверия предоставляют разные уровни разрешений. Код, который вы устанавливаете на своем компьютере, как правило, полностью доверенный, код, который вы запускаете из своей корпоративной сети, менее надежен, код, который вы запускаете из Интернета, вряд ли является доверенным вообще. Код, который вы запускаете на сервере SQL, получает наименьший уровень доверия из всех; он думает, что почти все небезопасно.
Что разрешено, если я отмечаю опцию разрешить небезопасный код?
Затем вы можете написать код, который напрямую манипулирует необработанными указателями в памяти способом по своему выбору. Это требует полного доверия; на вашу сборку должны быть наложены ограничения no , если вы хотите использовать небезопасный код. Небезопасный код может изменить каждый бит памяти пользовательского режима в процессе.
Какое отношение, если таковое имеется, имеет отношение к "совместимому" коду кода с тем, что сборка является "безопасной"?
Ничего, кроме того факта, что CLS-совместимый код не допускает API, которые принимают необработанные типы указателей.
CLS - это подмножество общих языков - набор функций, которые должны присутствовать на всех совместимых языках .NET. Таким образом, вам не нужно спрашивать себя: «Эй, если я напишу этот метод, который принимает int и возвращает строку в C #, могу ли я вызвать его из F #?» Если вы ограничиваете себя в соблюдении правил CLS, вы знаете, что любой язык CLS может использовать вашу библиотеку, и вы можете использовать CLS-совместимые библиотеки независимо от того, на каком языке они были написаны. Это не имеет никакого отношения к безопасности.
Код внутри небезопасного блока «небезопасный»
Код внутри небезопасного блока может произвольно повредить память в течение всего процесса, если он написан неправильно. Мы заставляем вас помечать код как «небезопасный», чтобы вы знали, где сосредоточить свои усилия по проверке кода. В небезопасном блоке вы , а не язык C # несете ответственность за обеспечение безопасности типов и памяти.
Вопрос, который вы не задавали:
Что означает пометить сборку как "безопасную для частично доверенного абонента"?
Это ситуация, когда вы делаете помечаете сборку как "безопасную". Помечая сборку с помощью AllowPartiallyTrustedCallerAttribute (APTCA), вы, автор сборки, утверждаете, что если код в сборке вызывается враждебным кодом с низким уровнем доверия, который пытается атаковать пользователя, то в вашей сборке ничего нет который враждебный код с низким уровнем доверия может использовать против пользователя. Короче говоря, вы говорите: «Даже если пользователь полностью доверяет мне, мой код не является оружием, которое злой код может использовать против пользователя».
Мы изобрели APTCA, потому что когда-то мы с Питером Торром обнаружили, что есть способ для враждебных вызывающих абонентов, у которых было низкое доверие, обмануть код JScript.NET - который по умолчанию был высоким - таким способом что код низкого доверия может заставить код JScript.NET атаковать пользователя от его имени. (Это обычно называется «атаку заманиванием», потому что код с низким уровнем доверия «заманивает» код с высоким уровнем доверия к выполнению за него грязной работы.)
В качестве лишь небольшой части большого усилия, направленного на то, чтобы такого рода ошибки больше не повторялись, команда CLR представила APTCA. Помещая APTCA на сборку, вы говорите своим пользователям, что заявляете, что их доверие к вашей работе не может быть использовано вредоносным сторонним кодом. Не помещайте APTCA в сборку, если (1) вы не намереваетесь , чтобы сборка вызывалась кодом, который, по мнению пользователя, может быть враждебным, и (2) вы фактически провели тщательный анализ безопасности.
К счастью, новая модель безопасности, основанная на прозрачности, в значительной степени устраняет необходимость в APTCA.
Если APTCA не присутствует в сборке, тогда «требование ссылки» обеспечит полное доверие к коду, вызывающему вашу сборку. Обратите внимание, что это потребность в ссылке , а не полная потребность .