private
수정은 클래스 외부 액세스를 제한하기 위해 사용되지만, 반사 다른 클래스를 사용하여 private 메소드 및 필드에 액세스 할 수 있습니다. 그래서 요구 사항의 일부인 경우 접근성을 어떻게 제한 할 수 있는지 궁금합니다.
private
수정은 클래스 외부 액세스를 제한하기 위해 사용되지만, 반사 다른 클래스를 사용하여 private 메소드 및 필드에 액세스 할 수 있습니다. 그래서 요구 사항의 일부인 경우 접근성을 어떻게 제한 할 수 있는지 궁금합니다.
답변:
액세스 수정 자의 목적은 개발자에게 클래스의 공용 인터페이스에 대한 코드를 작성하도록 알리는 것입니다. 그들은 어떤 식 으로든 보안 수단이 아니며 문자 그대로 정보를 숨기거나 보호하지 않습니다.
클래스 액세스 권한에 대해 Herb Sutter 를 인용하려면 :
"여기서 문제는 머피 (Murphy)와 마키아 벨리 (Machiavelli)에 대한 보호, 즉 우발적 인 오용 (언어가 잘하는 것)에 대한 보호와 의도적 인 남용 (실제로는 불가능한)에 대한 보호에 관한 것입니다. 프로그래머가 시스템을 파괴하기에 충분히 원하기 때문에 방법을 찾을 것입니다. "
#define private public
(실제로 정의되지 않은 동작임을 무시하고) voila 나는 외부에서 수업 의 제한된 부분 까지 완전히 액세스 할 수 있습니다.
아니요, 이것은 실제로 중요한 이점입니다. 단순히 일부 개발자가 누군가가 내부 상태에 액세스해야한다고 생각하지 않는다고해서 합법적 인 사용 사례가 나타나지 않는다는 의미는 아닙니다. 이 경우 리플렉션을 사용하여 물체에 대한 수술을 수행하는 것이 최후의 수단이 될 수 있습니다. 이 기술을 두 번 이상 사용해야했습니다.
어떤 반성에 대해 이야기하고 있습니까?
많은 리플렉션 시스템에서 우회 캡슐화는 코드에서 가져와야하는 명시 적 기능이며 기본적으로 없습니다.
캡슐화가 염려된다면 간단한 해결책은 그것을 보존하지 않는 반사 시스템을 사용하지 않는 것입니다.
파이썬에는 액세스 수정자가 없습니다. 이 규칙은 클래스 외부에서 액세스 할 수없는 메소드 및 변수에 밑줄을 붙입니다. 기술적으로 타사 클래스에서 해당 필드에 액세스하지 못하게합니까? 전혀; 그러나 그렇게한다면, 당신은 자신에 있고 다른 반을 비난하지 않고 무언가를 깨뜨릴 위험이 있습니다.
C #에는 액세스 수정자가 있지만 아직 규칙은 컴파일러에 의해 적용되지만 여전히 규칙입니다. 이는 기술적으로 리플렉션을 통해 또는 게임 트레이너 처럼 메모리를 직접 조작하여 개인 변수에 액세스하고 변경할 수 있음을 의미합니다 . 결과는 정확히 동일합니다. 클래스의 변수가 다른 클래스의 리플렉션을 통해 또는 다른 응용 프로그램의 메모리 변조를 통해 변경되어 클래스의 무언가가 중단되면 오류가 아닙니다.
이로 인해 타사가 데이터에 액세스 할 수있는 보안 문제가 발생 합니다. 암호화 된 문자열의 변형 및 유사한 데이터 구조로 이어지는 무언가 . 그러나 이러한 사용으로부터 코드를 보호하는 것은 OS 및 코드 수준 액세스 제한 과 관련 이 있으며 Reflection 자체와 아무런 관련이 없습니다.