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