csharp - assembly c# descargar
¿Cómo marcar un ensamblaje.net como seguro? (4)
¿Cómo puedo marcar como ensamblado como "seguro"?
Estás pensando en esto de la manera incorrecta.
Alguien que crees que quizás quiera matarte te da una botella y te dice "bebe esto". Usted dice "¿es seguro beber?" El tipo dice "lee la botella". Tú lo haces. Dice "SAFE TO DRINK" en él.
¿Lo bebes?
¡Si el líquido es seguro para beber o no tiene nada que ver con lo que dice la etiqueta en la botella! Es perfectamente posible colocar gasolina en una botella marcada como "SEGURO PARA BEBER".
Usted es el tipo que entrega el frasco lleno de líquido sospechoso al servidor SQL y el servidor SQL dice "No confío en ninguna etiqueta que vaya a poner en este ensamblaje". Más bien, va a hacer que el ensamblaje sea "seguro" al restringir lo que puede hacer el ensamblaje. Bloquea los permisos en esa cosa para que cualquier intento de su ensamblaje de aprovechar el servidor SQL resulte en su terminación a través de una excepción.
¿Cómo puedo saber cuándo algo en mi ensamblaje no es "seguro"?
Intenta ejecutarlo con poca confianza. ¿Se estrelló y murió con una excepción de seguridad? Si la respuesta es sí, entonces no fue seguro según ese nivel de confianza . Diferentes niveles de confianza otorgan diferentes niveles de permisos. El código que instala en su propia máquina suele ser totalmente confiable, el código que ejecuta desde su red corporativa es menos confiable, el código que ejecuta desde Internet no es confiable en absoluto. El código que ejecuta en el servidor SQL obtiene el menor nivel de confianza de todos; piensa que casi todo es inseguro.
¿Qué se permite si verifico la opción Permitir código no seguro?
Luego puede escribir un código que manipule directamente los punteros en bruto a la memoria de una manera que elija. Eso requiere plena confianza; no debe haber restricciones impuestas a su ensamblaje si desea utilizar un código inseguro. El código no seguro puede cambiar cada bit de la memoria del modo de usuario en el proceso.
¿Cuál es la relación, si la hay, tiene que ver el código "compatible con cls" con que un ensamblaje sea "seguro"?
Ninguna en absoluto, excepto el hecho de que el código compatible con CLS no permite las API que toman tipos de punteros en bruto.
CLS es el subconjunto de lenguaje común, el conjunto de características que deben estar presentes en todos los lenguajes .NET compatibles. De esa manera, no tiene que preguntarse "hey, si escribo este método que toma un int y devuelve una cadena en C #, ¿puedo llamarlo desde F #?" Si se restringe a seguir las reglas de CLS, entonces sabe que cualquier idioma de CLS puede usar su biblioteca, y puede usar bibliotecas compatibles con CLS sin importar en qué idioma se escribieron. No tiene nada que ver con la seguridad.
El código dentro del bloque inseguro es "inseguro"
El código dentro del bloque inseguro puede corromper arbitrariamente la memoria durante todo el proceso si está mal escrito. Hacemos que marque un código como ese "inseguro" para que sepa dónde concentrar sus esfuerzos de revisión de código. En un bloque inseguro, usted , no el lenguaje C # , es responsable de garantizar la seguridad de los tipos y la memoria.
Una pregunta que no hiciste:
¿Qué significa marcar un ensamblaje como "seguro para una persona que llama parcialmente de confianza"?
Esta es una situación en la que marca un ensamblaje como "seguro". Al marcar un ensamblaje con AllowPartiallyTrustedCallerAttribute (APTCA), usted, el autor del ensamblaje, está afirmando que si el código hostil de baja confianza que llama al código del intento intenta atacar al usuario, entonces no hay nada en su ensamblaje que el código hostil de baja confianza puede utilizar contra el usuario. En resumen, está diciendo "incluso si el usuario confía plenamente en mí, mi código no es un arma que el código malvado pueda usar contra el usuario".
Inventamos APTCA porque en su momento, Peter Torr y yo descubrimos que había una manera para que las personas que llaman hostiles tuvieran poca confianza para engañar al código JScript.NET, que era una alta confianza por defecto, de tal manera que la baja el código de confianza podría hacer que el código JScript.NET ataque al usuario en su nombre. (Esto suele denominarse "ataque de atracción" porque el código de baja confianza "engaña" al código de alta confianza para que haga su trabajo sucio por él).
Como solo una pequeña parte de un gran esfuerzo para garantizar que este tipo de error no volviera a ocurrir, el equipo de CLR presentó APTCA. Al colocar APTCA en un ensamblaje, le está diciendo a sus usuarios que está reclamando que su confianza en su trabajo no es abusable por el código de terceros hostiles. No coloque APTCA en un ensamblaje a menos que (1) tenga la intención de que el ensamblaje sea llamado por un código que el usuario cree que puede ser hostil, y (2) realmente ha realizado una revisión de seguridad exhaustiva.
El nuevo modelo de seguridad basado en la transparencia elimina gran parte de la necesidad de APTCA, afortunadamente.
Si APTCA no está presente en un ensamblaje, entonces una "demanda de enlace" asegurará que el código que invoca su ensamblaje sea de plena confianza. Tenga en cuenta que es una demanda de enlace , no una demanda completa .
¿Cómo puedo marcar como ensamblado como "seguro"?
Alternativamente, ¿cómo tengo Visual Studio que me dice cuando algo en mi ensamblaje no es "seguro"?
A veces no puede usar un ensamblaje a menos que sea "seguro" (por ejemplo, de SQL Server ).
Quisiera que mi montaje fuera marcado como seguro. Si mi ensamblaje no se puede marcar como seguro porque no es seguro, me gustaría saber cómo puedo saber que mi ensamblaje no es seguro.
Hay algunos conceptos en Visual Studio que parecen estar relacionados con la seguridad, que pueden o no tener nada que ver con que un ensamblaje sea "seguro":
Permitir opción de ensamblaje de código no seguro :
- ¿Qué se permite si verifico la opción Permitir código no seguro ?
- ¿Qué no está permitido si desactivo la opción de permitir código inseguro ?
¿Qué relación, si la hay, tiene que ver el "código inseguro" con que un ensamblaje sea "seguro"?
(pregunto porque mi ensamblaje no "permite el código inseguro", sino que permite llamadas P / Invoke, lo que pensé que era la definición de "inseguro")
ClsCompliant montaje ClsCompliant :
[assembly: CLSCompliant(true)] namespace MyApplication
- ¿Cuál es la relación, si la hay, tiene que ver el código "compatible con cls" con que un ensamblaje sea "seguro"?
bloque de código inseguro :
int error; unsafe { error = 0x80004005; }
El código dentro del bloque
unsafe
es "inseguro"Microsoft recomienda crear una clase llamada
UnsafeNativeMethods
que contenga código administrado inseguro:[SuppressUnmanagedCodeSecurity] internal static class UnsafeNativeMethods { ... }
Esto contrasta con
SafeNativeMethods
:[SuppressUnmanagedCodeSecurity] internal static class SafeNativeMethods { ... }
que contiene métodos nativos seguros, y
NativeMethods
:internal static class SafeNativeMethods { ... }
que contienen métodos nativos.
¿Cómo puedo marcar como ensamblado como "seguro"?
¿Cómo sabe SQL que un ensamblado no es "seguro"?
Depende de lo que quiere decir, pero si importa un ensamblaje (es decir, un archivo .dll), existe una opción de "desbloqueo" en las propiedades de ese archivo .dll. Esto le permitirá utilizar la dll como referencia.
En este caso, SQL está buscando un código que haya envuelto en un bloque "inseguro". Aquí hay un puntero de MSDN a la palabra clave insegura
- Leyendo de this , el "Seguro" para SQL Server es un:
SAFE es el conjunto de permisos más restrictivo. El código ejecutado por un ensamblaje con permisos SAFE no puede acceder a recursos externos del sistema, como archivos, la red, variables de entorno o el registro
por lo que se trata de un conjunto de permisos de ejecución de código dentro del dominio de código de SQL Server
Unsafe
indicador no seguro de VS no tiene nada que ver, básicamente, con la seguridad de ejecución de código, pero permite la ejecución de código no administrado . Así que esto se trata de la integración de código no administrado en la base de código administradoCLS Compilant
atributo deCLS Compilant
como se define ClsCompliant trata sobre la definición del código del ensamblaje marcado con ese atributo como un código que sigue la guía de CSL (Especificación de lenguaje común). Así que esto se trata de compilación y arquitectura de código .
¿Cómo puedo marcar como ensamblado como "seguro"?
Se definió en el primer enlace de esta respuesta y tiene relación con la integración de SQL Server.
¿Cómo sabe SQL que un ensamblado no es "seguro"?
Teniendo en cuenta la descripción proporcionada: "Crea un módulo de aplicación administrada que contiene metadatos de clase y código administrado como un objeto en una instancia de SQL Server", SQL Server transmite sobre los metadata
, que en algunos campos proporciona información sobre el hecho de si es "seguro" o no.