Conjunto de reglas de análisis de código Reglas mínimas recomendadas de Microsoft
Puede utilizar el conjunto Reglas mínimas recomendadas de Microsoft para centrarse en los problemas más importantes del código, entre los que se incluyen las posibles vulnerabilidades de seguridad, los bloqueos de la aplicación y otros errores importantes de lógica y diseño. Se recomienda incluir este conjunto de reglas en todos los conjuntos de reglas personalizados que cree para sus proyectos.
Regla |
Descripción |
---|---|
CA1001: Los tipos que poseen campos descartables deben ser descartables |
Una clase declara e implementa un campo de instancia que es de tipo System.IDisposable y la clase no implementa IDisposable. Una clase que declara un campo IDisposable posee indirectamente un recurso no administrado y debería implementar la interfaz IDisposable. |
Los métodos de control de eventos toman dos parámetros. El primero es de tipo System.Object y se denomina "sender". Éste es el objeto que provocó el evento. El segundo parámetro es de tipo System.EventArgs y se denomina "e". Éste son los datos asociados al evento. Los métodos de control de eventos no deben devolver un valor; en el lenguaje de programación C#, esto se indica mediante el tipo de valor devuelto void. |
|
.NET Framework utiliza el número de versión para identificar de forma única un ensamblado y para enlazarse a los tipos de ensamblados con nombre seguro. El número de versión se utiliza junto con la versión y la directiva del fabricante. De forma predeterminada, las aplicaciones sólo se ejecutan con la versión de ensamblado con la que se generaron. |
|
CA1033: Los tipos secundarios deberían poder llamar a los métodos de interfaz |
Un tipo no sellado visible externamente proporciona un método explícito de implementación de una interfaz pública pero no proporciona un método visible externamente alternativo con el mismo nombre. |
CA1049: Los tipos que poseen recursos nativos deben ser descartables |
Los tipos que se asignan a recursos no administrados deberían implementar IDisposable para permitir que los llamadores liberen estos recursos a petición y reduzcan el período de duración de los objetos que contienen los recursos. |
Los métodos de invocación de plataforma, como aquellos marcados con el atributo System.Runtime.InteropServices.DllImportAttribute o los métodos definidos utilizando la palabra clave Declare en Visual Basic, tienen acceso al código no administrado. Estos métodos deben ser de la clase NativeMethods, UnsafeNativeMethods o SafeNativeMethods. |
|
Un método de un tipo base está oculto por un método del mismo nombre en un tipo derivado cuando la firma del parámetro del método derivado solo se diferencia por tipos derivados de manera más débil que los tipos correspondientes de la firma del parámetro del método base. |
|
Todos los tipos IDisposable deben implementar el modelo de Dispose correctamente. |
|
Un método que no se espera que produzca excepciones inicia una excepción. |
|
Una tecla de acceso, también denominada acelerador, permite el acceso mediante teclado a un control utilizando la tecla ALT. Cuando varios controles tienen las teclas de acceso duplicadas, no se define correctamente el comportamiento de la tecla de acceso. |
|
Un método público o protegido se marca con el atributo System.Runtime.InteropServices.DllImportAttribute. No se pudo encontrar la biblioteca no administrada o el método no coincide con una función de la biblioteca. |
|
Un método público o protegido en un tipo público tiene el atributo System.Runtime.InteropServices.DllImportAttribute (también se implementa por la palabra clave Declare en Visual Basic). No se deberían exponer estos métodos. |
|
CA1403: Los tipos de diseño automático no deben ser visibles para COM |
Un tipo de valor visible a través de COM se marca con el atributo System.Runtime.InteropServices.StructLayoutAttribute establecido en LayoutKind.Auto. El diseño de estos tipos puede cambiar de una versión a otra de .NET Framework, lo que interrumpirá a los clientes COM que esperan un diseño concreto. |
CA1404: Llame a GetLastError inmediatamente después de P/Invoke |
Se llama al método Marshal.GetLastWin32Error o al equivalente de la función GetLastError de Win32 y la llamada inmediatamente anterior no se realiza a un método de invocación de plataforma. |
CA1405: Los tipos base de tipos visibles para COM deben ser visibles para COM |
Un tipo visible a través de COM se deriva de un tipo no visible a través de COM. |
Un tipo declara un método marcado con el atributo System.Runtime.InteropServices.ComRegisterFunctionAttribute pero no declara ningún método marcado con el atributo System.Runtime.InteropServices.ComUnregisterFunctionAttribute o viceversa. |
|
Esta regla busca declaraciones de método de invocación de plataforma dirigidas a funciones de Win32 que tengan un puntero a un parámetro de estructura OVERLAPPED y el parámetro administrado correspondiente no es un puntero para una estructura System.Threading.NativeOverlapped. |
|
CA1900: Los campos de tipos de valor deberían ser portátiles |
Esta regla comprueba que las estructuras declaradas con un diseño explícito se alinearán correctamente cuando se calculen las referencias al código no administrado en sistemas operativos de 64 bits. |
Esta regla evalúa el tamaño de cada parámetro y el valor devuelto de P/Invoke, y comprueba que su tamaño sea correcto al calcular las referencias para su conversión al código no administrado en sistemas operativos de 32 y 64 bits. |
|
Dado que podría producirse un evento excepcional que evitaría que el finalizador de un objeto se ejecutase, el objeto debe estar disponible en su lugar antes de que todas las referencias a él estén fuera del ámbito. |
|
Se dice que un objeto tiene una identidad débil cuando se puede tener acceso directamente a través de los límites del dominio de aplicación. Un subproceso que intenta obtener un bloqueo en un objeto que tiene identidad débil se puede bloquear con un segundo subproceso en un dominio de aplicación diferente que tenga bloqueado el mismo objeto. |
|
CA2100: Revisar las consultas SQL en busca de vulnerabilidades de seguridad |
Un método establece la propiedad System.Data.IDbCommand.CommandText utilizando una cadena que se construye partiendo de un argumento de cadena para el método. Esta regla supone que el argumento de cadena contiene datos proporcionados por el usuario. Una cadena de comandos de SQL generada a partir de datos proporcionados por el usuario es vulnerable a ataques de inserción de SQL. |
CA2101: Especifique cálculo de referencias para argumentos de cadena P/Invoke |
Un miembro de invocación de plataforma permite llamadores que no son de plena confianza y no calcula explícitamente las referencias a la cadena. Esto puede producir una vulnerabilidad de seguridad. |
CA2108: Revisar la seguridad declarativa en los tipos de valor |
Un tipo de valor público o protegido está protegido por acceso a datos o peticiones de vínculos. |
Un puntero no es privado, interno ni de solo lectura. El código malintencionado puede cambiar el valor del puntero y permitir potencialmente el acceso a ubicaciones arbitrarias en memoria o provocar errores del sistema o de aplicación. |
|
Un tipo público o protegido contiene campos públicos y está protegido por peticiones de vínculos. Si el código tiene acceso a una instancia de tipo que está protegida por una solicitud de vínculo, el código no cumplirá la solicitud para obtener acceso a los campos del tipo. |
|
CA2114: La seguridad del método debería ser un supraconjunto del tipo |
Un método no debe tener seguridad declarativa en el nivel de método y de tipo para la misma acción. |
Si está presente el atributo APTCA (AllowPartiallyTrustedCallers) en un ensamblado de plena confianza y el ensamblado ejecuta código en otro ensamblado que permite llamadores parcialmente confiables, se puede producir un ataque en el sistema de seguridad. |
|
Si está presente el atributo APTCA (AllowPartiallyTrustedCallers) en un ensamblado de plena confianza y un tipo del ensamblado se hereda de otro que permite llamadores parcialmente confiables, se puede producir un ataque de seguridad. |
|
CA2122: No exponer indirectamente métodos con peticiones de vínculos |
Un miembro público o protegido tiene peticiones de vínculos y lo llama un miembro que no realiza ninguna comprobación de seguridad. Una solicitud de vínculo sólo comprueba los permisos del llamador inmediato. |
CA2123: Las peticiones de vínculos de reemplazo deberían ser idénticas a la base |
Esta regla compara un método con su método base, que es una interfaz o un método virtual de otro tipo y, a continuación, compara las solicitudes de vínculos en cada uno. Si se infringe esta regla, un llamador malintencionado puede omitir la solicitud de vínculo tan solo con llamar al método no seguro. |
CA2124: Incluir cláusulas Finally vulnerables en un bloque Try externo |
Un método público o protegido contiene un bloque try-finally. El bloque finally aparece para restablecer el estado de seguridad y no se incluye a sí mismo en un bloque finally. |
CA2126: Las peticiones de vínculos de tipos requieren peticiones de herencias |
Un tipo público no sellado está protegido con una petición de vínculo y tiene un método reemplazable. Ni el tipo ni el método están protegidos con una petición de herencia. |
CA2131: Los tipos críticos para la seguridad no pueden participar en la equivalencia de tipos |
Un tipo participa en la equivalencia de tipos y el propio tipo, o un miembro o campo del tipo, se marca mediante el atributo SecurityCriticalAttribute. Esta regla se produce en todos los tipos críticos o en los tipos que contienen métodos o campos críticos que participan en la equivalencia de tipos. Cuando CLR detecta esta clase de tipo, no lo carga con TypeLoadException en tiempo de ejecución. Normalmente, esta regla solo se genera cuando los usuarios implementan la equivalencia de tipos de forma manual, en vez de basarse en tlbimp y en los compiladores para realizar la equivalencia de tipos. |
El código de la aplicación Silverlight no puede usar los tipos y miembros con SecurityCriticalAttribute. Los tipos y miembros críticos para la seguridad solo los puede usar el código de confianza de .NET Framework para la biblioteca de clases de Silverlight. Dado que una construcción pública o protegida en una clase derivada debe tener la misma transparencia, o mayor, que su clase base, una clase de una aplicación no puede derivar de una clase marcada como SecurityCritical. |
|
CA2133: Los delegados deben enlazarse a métodos con una transparencia coherente |
Esta advertencia se genera en un método que enlaza un delegado marcado mediante SecurityCriticalAttribute a un método que es transparente o está marcado con SecuritySafeCriticalAttribute. La advertencia también desencadena un método que enlaza un delegado transparente o crítico para la seguridad a un método crítico. |
CA2134: Los métodos deben mantener una transparencia coherente cuando reemplazan métodos base |
Esta regla se genera cuando un método marcado mediante SecurityCriticalAttribute invalida un método que es transparente o está marcado con SecuritySafeCriticalAttribute. Esta regla también se genera cuando un método marcado mediante SecurityCriticalAttribute invalida un método que es transparente o está marcado con SecuritySafeCriticalAttribute. Se aplica la regla al invalidar un método virtual o implementar una interfaz. |
CA2137: Los métodos transparentes deben contener solo IL que se pueda comprobar |
Un método contiene código que no se puede comprobar o devuelve un tipo por referencia. Esta regla se desencadena en los intentos del código transparente en seguridad de ejecutar MISL no comprobable (Lenguaje intermedio de Microsoft). Sin embargo, la regla no contiene un comprobador de IL completo y, en su lugar, utiliza la heurística para detectar la mayoría de las infracciones de comprobación MSIL. |
Un método transparente en seguridad llama a un método marcado mediante el atributo SuppressUnmanagedCodeSecurityAttribute. |
|
CA2141: Los métodos transparentes no deben satisfacer LinkDemands |
Un método transparente en seguridad llama a un método de un ensamblado no marcado mediante APTCA o bien satisface un LinkDemand para un tipo o método. |
CA2146: Los tipos deben ser al menos tan críticos para la seguridad como sus interfaces y tipos base |
Un método transparente en seguridad llama a un método de un ensamblado no marcado mediante APTCA o bien satisface un LinkDemand para un tipo o método. |
CA2147: Los métodos transparentes no pueden usar aserciones de seguridad |
El código marcado como SecurityTransparentAttribute no tiene permisos suficientes para imponerse. |
CA2149: Los métodos transparentes no deben llamar a código nativo |
Esta regla se genera en cualquier método transparente que llame directamente al código nativo (por ejemplo, a través de P/Invoke). Las infracciones de esta regla tienen como resultado una excepción MethodAccessException en el modelo de transparencia de nivel 2 y una demanda completa de UnmanagedCode en el modelo de transparencia de nivel 1. |
CA2200: Iniciar de nuevo para preservar los detalles de la pila |
Se vuelve a producir una excepción y se especifica explícitamente en la instrucción throw. Si se vuelve a producir una excepción especificándola en la instrucción throw, se pierde la lista de llamadas al método entre el método original que produjo la excepción y el método actual. |
La implementación de un método contiene rutas de acceso del código que podrían provocar varias llamadas a System.IDisposable.Dispose o a un equivalente de Dispose (como un método Close() en algunos tipos) en el mismo objeto. |
|
CA2207: Inicializar campos estáticos de tipo de valor insertados |
Un tipo de valor declara un constructor estático explícito. Para corregir una infracción de esta regla, inicialice todos los datos estáticos cuando se declara y quite el constructor estático. |
CA2212: No marcar los componentes con servicio como WebMethod |
Un método en un tipo que hereda de System.EnterpriseServices.ServicedComponent está marcado con System.Web.Services.WebMethodAttribute. Dado que un método ServicedComponent y WebMethodAttribute tienen comportamientos y requisitos conflictivos para el flujo de transacción y el contexto, el comportamiento del método es incorrecto en algunas situaciones. |
Un tipo que implementa System.IDisposable declara campos que son de tipos que también implementan IDisposable. El método Dispose del tipo declarativo no llama al método Dispose del campo. |
|
Cuando un constructor llama a un método virtual, es posible que no se haya ejecutado el constructor para la instancia que invoca el método. |
|
CA2216: Los tipos descartables deben declarar el finalizador |
Un tipo que implementa System.IDisposable y tiene campos que sugieren el uso de recursos no administrados, no implementa un finalizador descrito por Object.Finalize. |
CA2220: Los finalizadores deben llamar al finalizador de la clase base |
La finalización se debe difundir a través de la jerarquía de herencia. Para garantizar esto, los tipos deben llamar a su método Finalize de clase base en su propio método Finalize. |
Para corregir una infracción de esta regla, implemente el constructor de serialización. Para una clase sellada, marque el constructor como privado; de lo contrario, márquelo como protegido. |
|
CA2232: Marcar puntos de entrada de Windows Forms con STAThread |
STAThreadAttribute indica que el modelo de subprocesos de COM para la aplicación es un apartamento de un único subproceso. Este atributo debe estar presente en el punto de entrada de cualquier aplicación que utilice Formularios Windows Forms; si se omite, los componentes de Windows podrían no funcionar correctamente. |
Un campo de instancia de un tipo que no es serializable se declara en un tipo que es serializable. |
|
LCA2236: Llamar a métodos de clase base en tipos ISerializable |
Para corregir una infracción de esta regla, llame al método de tipo base GetObjectData o al constructor de serialización desde el constructor o el método de tipo derivado correspondiente. |
CA2237: Marcar los tipos ISerializable con SerializableAttribute |
Para que los tipos sean reconocidos como serializables por Common Language Runtime, deben estar marcados con el atributo SerializableAttribute incluso si el tipo utiliza una rutina de serialización personalizada a través de la implementación de la interfaz ISerializable. |
CA2238: Implementar los métodos de serialización de forma correcta |
Un método que controla un evento de serialización no especifica la firma correcta, el tipo de valor devuelto ni la visibilidad. |
Para corregir una infracción de esta regla, haga que el método GetObjectData sea visible y reemplazable, y asegúrese de que todos los campos de instancia se incluyan en el proceso de serialización o se marquen explícitamente con el atributo NonSerializedAttribute. |
|
CA2241: Proporcionar argumentos correctos para los métodos de formato |
El argumento format pasado a System.String.Format no contiene un elemento de formato que corresponda a cada argumento de objeto o viceversa. |
Esta expresión prueba un valor respecto a Single.Nan o Double.Nan. Utilice IsNan(Single) o Double.IsNan(Double) para probar el valor. |