ABAP 와 자바 단일 모드 의 공 방

ABAP

CLASS zcl_jerry_singleton DEFINITION

PUBLIC

FINAL

CREATE PRIVATE .

PUBLIC SECTION.

INTERFACES if_serializable_object .

CLASS-METHODS class_constructor .

CLASS-METHODS get_instance

RETURNING

VALUE(ro_instance) TYPE REF TO zcl_jerry_singleton .

PROTECTED SECTION.

PRIVATE SECTION.

CLASS-DATA so_instance TYPE REF TO zcl_jerry_singleton .

DATA mv_name TYPE string .

DATA mv_initialized TYPE abap_bool .

METHODS constructor .

ENDCLASS.

CLASS ZCL_JERRY_SINGLETON IMPLEMENTATION.

* ---------------------------------------------------------------------------------------+

* | Static Public Method ZCL_JERRY_SINGLETON=>CLASS_CONSTRUCTOR

* +-------------------------------------------------------------------------------------------------+

* +--------------------------------------------------------------------------------------

METHOD class_constructor.

so_instance = NEW zcl_jerry_singleton( ).

ENDMETHOD.

* ---------------------------------------------------------------------------------------+

* | Instance Public Method ZCL_JERRY_SINGLETON->CONSTRUCTOR

* +-------------------------------------------------------------------------------------------------+

* +--------------------------------------------------------------------------------------

METHOD constructor.

mv_name = 'Jerry'.

IF mv_initialized = abap_false.

mv_initialized = abap_true.

ELSE.

MESSAGE 'you are in trouble!' TYPE 'E' DISPLAY LIKE 'I'.

ENDIF.

ENDMETHOD.

* ---------------------------------------------------------------------------------------+

* | Static Public Method ZCL_JERRY_SINGLETON=>GET_INSTANCE

* +-------------------------------------------------------------------------------------------------+

* | [

METHOD get_instance.

ro_instance = so_instance.

ENDMETHOD.

ENDCLASS.

직렬 화 / 반 직렬 화 공격 단일 모드 를 통 해:

DATA(lo_instance) = zcl_jerry_singleton=>get_instance( ).

DATA: s TYPE string.

CALL TRANSFORMATION id SOURCE model = lo_instance RESULT XML s.

DATA: lo_instance2 TYPE REF TO zcl_jerry_singleton.

CALL TRANSFORMATION id SOURCE XML s RESULT model = lo_instance2.

단 례 의 제한 을 피해 두 번 째 실례 를 만 들 었 다.
Java
직렬 화 / 반 직렬 화 공격 외 에 반사 공격 도 할 수 있다.
그러나 저 는 이 단일 클래스 Jerry Singleton 의 구조 함 수 를 반 사 를 통 해 Accessible 에 접근 할 수 있 도록 설정 한 다음 에 이 구조 함 수 를 반사 적 으로 호출 하여 새로운 대상 인 스 턴 스 를 생 성 할 수 있 습 니 다.이렇게 해서 단일 모델 을 파괴 했다.
여섯 번 째 줄 코드 는 false 를 인쇄 합 니 다.
이러한 공격 에 대해 실행 가능 한 방어 조 치 는 단일 클래스 의 구조 함수 에서 불 변 수 를 정의 하고 false 로 초기 화 하 는 것 입 니 다.구조 함수 가 실 행 된 후 이 변 수 는 true 로 설정 되 었 습 니 다.다음 구조 함수 가 다시 실 행 될 경우 인위적인 이상 을 던 져 구조 함수 의 중복 집행 을 피한다.
이러한 방어 조 치 는 싱글 톤 의 공격 을 근본적으로 막 을 수 없다. 공격 자 는 여전히 반사 적 으로 불 변수 flag 의 값 을 수정 하여 이 검 사 를 돌아 갈 수 있 기 때문이다.
가장 이상 적 인 공격 을 받 지 않 는 단일 모드 구현 은 자바 에서 매 거 진 Enumeration 의 특성 을 빌 리 는 것 입 니 다.
이러한 실현 유형의 단일 모델 의 소비 코드:
System.out.println("Name:" + JerrySingletonAnotherApproach.INSTANCE.getName());
만약 에 공격 자가 앞에서 소개 한 반사 코드 를 통 해 이러한 실현 방식 의 단일 사례 를 공격 하면 JDK 는 NoSuchMethodException 이상 을 던 집 니 다.
그 이 유 는 현재 우 리 는 자바 매 거 방식 을 통 해 이 루어 진 단일 사례 이 고 매 거 류 는 전통 적 인 의미 에서 의 구조 함수 가 없 기 때문에 이런 반사 공격 에 면역 이 되 기 때문이다.
더 많은 Jerry 의 오리지널 글 을 얻 으 려 면 대중 번호 인 '왕 자 희' 를 주목 하 세 요.

좋은 웹페이지 즐겨찾기