2012-03-27 10 views
6

Necesitamos "proteger" a una clase de tener métodos estáticos por razones de seguridad. No queremos que los desarrolladores nuevos sigan sugerencias de herramientas de codificación para hacer que un miembro sea estático ya que necesitamos usar un constructor con una contraseña para controlar el acceso a esta clase.¿Se debe instanciar una clase en C#?

¿Hay alguna forma de proteger una clase .NET en C# para evitar que tenga miembros estáticos?

¿Tal función, si no está disponible, valdría la pena para una versión futura de .NET?

Gracias.

+10

Esto parece pedirle a sus herramientas que sean responsables del usuario. ¿Por qué no simplemente entrena a tus desarrolladores sobre cómo usar la API de forma adecuada? – rossipedia

+2

Realmente me gustaría escuchar el razonamiento para eliminar los métodos estáticos. ¿Puedes compartir, por favor? –

+10

Newbie devs vs. devs que hacen constructores con contraseñas para restringir instanciación/herencia? wow, y no es una función que no vale la pena – meandmycode

Respuesta

8

Probablemente podría usar StyleCop para hacer cumplir una regla personalizada. Sin embargo, debería implementarse como una acción de compilación.

Alternativamente, puede usar FxCop para analizar los binarios.

3

Puede ejecutar una comprobación utilizando la reflexión en el tiempo de ejecución, pero aparte de eso, no hay ninguna característica de idioma que impida los miembros estáticos.

No puedo pensar en un buen uso para tal característica. Este es un problema de comunicación en lugar de uno de implementación.

En su caso, podría colocar su funcionalidad protegida en una clase base abstracta, y ejecutar una comprobación para ver si el usuario está autorizado antes de realizar cualquier función protegida.

+0

Agregar un constructor estático que verifica la presencia de métodos estáticos es fácil de escribir. – CodesInChaos

0

Creo que una clase sellada sería suficiente, aunque los miembros estáticos están permitidos en la declaración de clase original. Creo que las clases derivadas no permitirían más miembros estáticos.

9

Lo más fácil sería configurar FxCop en su servidor de compilación y escribir una regla de FxCop personalizada para comprobar si hay miembros estáticos.

This question tiene detalles sobre cómo escribir una regla de FxCop personalizada.


Alternativamente, como SimpleCoder señaló, puede utilizar StyleCop para hacer cumplir la regla en el código fuente.

This page describe cómo configurar StyleCop con msbuild.

0

Tengo que admitir que nunca he oído hablar de un esquema de seguridad de este tipo. Creo que hay una buena razón por la que no he oído hablar de eso. ¿Estás seguro de que es tan protector como quieres que sea?

Al requerir que el constructor contenga una contraseña, intenta protegerse de las personas que usan su clase. Pero esas personas pueden descompilar y volver a compilar su clase para eliminar la verificación de contraseña, entonces, ¿contra qué están protegidos?

29

necesitamos usar un constructor con una contraseña para controlar el acceso a esta clase.

Esto suena como una idea monumentalmente mala, pero por supuesto no sé nada sobre el problema de seguridad que está tratando de resolver. Esta es la pregunta mucho más interesante que su pregunta: ¿Cuál es la amenaza contra la que intenta proteger? Probablemente haya una mejor manera de hacerlo.

¿Hay alguna forma de proteger una clase .NET en C# para evitar que tenga miembros estáticos?

Haga que los desarrolladores sénior revisen los registros de los desarrolladores junior. Que debería estar haciendo de todos modos, pero particularmente si la clase tiene algún tipo de semántica de seguridad.

¿Valdría esa función, si no está disponible, para una versión futura de .NET?

Eso es poco probable en el extremo.

Gracias.

De nada!

+3

Robó los pensamientos directamente de mi cerebro. – StriplingWarrior

+5

+5 por '¡De nada!' –

+2

@SimpleCoder: Mi madre me enseñó a decir eso cuando alguien me lo agradece. –

0

Sugerencias

  1. Formación
  2. Más formación
  3. Código Opiniones
  4. Otros sugirieron StyleCop o FxCop - tanto buenas opciones
  5. Si # 4 falla - más formación - esta vez empate a revisiones de rendimiento. :)
0

Estoy bastante de acuerdo con Eric Lippert. Pero en esos casos quiero hacer algo como esto (a veces solo para evitar cometer errores). Trato de escribir una prueba unitaria para ello. De esta manera:

[Test] 
public void Class_should_not_have_static_methods() 
{ 
    var staticMethods = typeof (Foo).GetMethods().Where(x => x.IsStatic); 

    Assert.That(staticMethods.Count(), Is.EqualTo(0), "Static methods: " + string.Join(", ", staticMethods.Select(x => x.Name))); 
} 
Cuestiones relacionadas