다음을 통해 공유


보안 및 Serialization

업데이트: 2007년 11월

serialization을 사용하면 액세스할 수 없었던 개체 인스턴스 데이터를 다른 코드에서 보거나 수정할 수 있게 되므로 serialization을 수행하는 코드에는 SerializationFormatter 플래그가 지정된 SecurityPermission이라는 특수 권한이 필요합니다. 기본 정책에 따라 이 권한은 인터넷에서 다운로드한 코드나 인트라넷 코드에는 부여되지 않고 로컬 컴퓨터에 있는 코드에만 부여됩니다.

일반적으로는 개체 인스턴스의 모든 필드가 serialize됩니다. 즉, 데이터가 해당 인스턴스에 대해 serialize된 데이터로 나타납니다. 형식을 해석할 수 있는 코드는 멤버의 액세스 가능성에 상관없이 해당 데이터 값이 무엇인지 확인할 수 있습니다. 마찬가지로 deserialization에서는 액세스 가능성 규칙과 상관없이 serialize된 표현에서 데이터를 추출하고 개체 상태를 직접 설정합니다.

보안상 중요한 데이터를 포함할 수 있는 개체의 경우에는 가능하면 개체를 serialize할 수 없게 만들어야 합니다. 개체를 serialize할 수 있어야 하면 중요한 데이터를 serialize할 수 없게 유지하는 특정 필드를 만드십시오. 이러한 필드를 만들지 못하면 해당 데이터가 serialize 권한을 가진 모든 코드에 노출된다는 점을 명심하고 악성 코드가 이 권한을 얻지 못하게 하십시오.

ISerializable 인터페이스는 serialization 인프라에서만 사용할 수 있는 인터페이스입니다. 그러나 이 인터페이스는 보호되지 않으면 중요한 정보를 유출시킬 수도 있습니다. ISerializable을 구현하여 사용자 지정 serialization을 제공하는 경우에는 다음과 같은 예방 조치를 취해야 합니다.

  • GetObjectData 메서드는 SerializationFormatter 권한이 지정된 SecurityPermission을 요청하거나 중요한 정보가 메서드 출력을 통해 유출되지 않게 함으로써 명시적으로 보호되어야 합니다. 예를 들면 다음과 같습니다.

    Public Overrides<SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter := True)>  _
    Sub GetObjectData(info As SerializationInfo, context As StreamingContext)
    End Sub 
    
    [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter 
    =true)]
    public override void GetObjectData(SerializationInfo info, 
    StreamingContext context)
    {
    }
    
  • serialization에 사용되는 특수한 생성자는 철저한 입력 유효성 검사도 수행해야 하며, 악성 코드에 의한 악용을 막기 위해 protected 또는 private으로 선언되어야 합니다. 또한, 클래스를 명시적으로 만들거나 특정 유형의 팩터리를 통해 간접적으로 만드는 등의 방법으로 클래스의 인스턴스를 얻는 데 필요한 것과 동일한 보안 검사 및 권한을 적용해야 합니다.

참고 항목

기타 리소스

보안 코딩 지침