El private
modificador se usa para restringir el acceso fuera de la clase, pero al usar la reflexión, otras clases pueden acceder a métodos y campos privados. Así que me pregunto cómo podemos restringir la accesibilidad si es parte del requisito.
security
reflection
usuario245930
fuente
fuente
Respuestas:
El propósito de los modificadores de acceso es informar a los desarrolladores que escriben código sobre cuál es la interfaz pública de una clase. No son de ninguna manera una medida de seguridad y, literalmente, no ocultan ni aseguran ninguna información.
fuente
Para citar a Herb Sutter sobre los derechos de acceso a clases :
"El problema aquí es proteger contra Murphy frente a proteger contra Maquiavelo ... es decir, proteger contra el mal uso accidental (que el lenguaje hace muy bien) frente a proteger contra el abuso deliberado (que es efectivamente imposible). Al final, si un programador quiere lo suficiente como para subvertir el sistema, encontrará una manera "
fuente
#define private public
(ignorando que en realidad es un comportamiento indefinido) y listo, tengo acceso completo desde el exterior a la parte restringida de sus clases.No, esto es realmente una ventaja importante. Simplemente porque algún desarrollador no consideró que alguien necesitaría acceso a algún estado interno no significa que nunca se presente un caso de uso legítimo. En estos casos, usar Reflection para realizar una cirugía en un objeto puede ser el último recurso. He tenido que usar esta técnica más de una vez.
fuente
Restringe aún más la accesibilidad al subir un nivel más: el entorno de ejecución.
No todos los idiomas tienen este concepto, pero al menos con Java puede usar un administrador de seguridad que prohíbe hacer accesibles los campos privados. Puede instalar manualmente el administrador de seguridad en tiempo de ejecución o agregar una política de seguridad en un archivo jar que luego se sella para evitar modificaciones.
Más información sobre cómo hacer esto en Java: Reflection Security
fuente
¿De qué reflexión estás hablando?
En muchos sistemas de reflexión, eludir la encapsulación es una capacidad explícita que su código necesita obtener, y no tiene por defecto.
Si le preocupa la encapsulación, la solución simple es simplemente no usar un sistema de reflexión que no lo conserve.
fuente
En Python, no hay modificadores de acceso. La convención es prefijar con un guión bajo los métodos y variables a los que no se espera acceder desde fuera de la clase. ¿Te impide técnicamente acceder a dicho campo desde una clase de terceros? De ningún modo; pero si lo hace, está solo y corre el riesgo de romper algo, sin poder culpar a la otra clase.
En C #, los modificadores de acceso existen, pero todavía son solo una convención, una que es aplicada por un compilador, pero sigue siendo una convención. Esto significa que técnicamente, todavía se puede acceder y cambiar variables privadas, ya sea a través de Reflection o alterando directamente la memoria (como hacen los entrenadores de juegos ). La consecuencia es exactamente la misma: si las variables de su clase se cambian a través de Reflection de otra clase, o mediante la manipulación de la memoria por otra aplicación, y se rompe algo en su clase, no es su culpa.
Tenga en cuenta que esto, obviamente, crea problemas de seguridad en los que un tercero puede acceder a sus datos; algo que conduce a variantes encriptadas de una cadena y estructuras de datos similares. Pero proteger su código de dicho uso es un sistema operativo más relacionado y restricciones de acceso a nivel de código , y no tiene nada que ver con Reflection per se.
fuente