セキュリティとシリアル化

シリアル化を使用すると、他の方法ではアクセスできないオブジェクト インスタンス データを他のコードから参照または変更できるようになるため、シリアル化を実行するコードには、SerializationFormatter フラグを指定した SecurityPermission という特殊なアクセス権が必要です。既定のポリシーでは、インターネットからダウンロードしたコードまたはイントラネット コードにはこのアクセス権は付与されず、ローカル コンピュータ上のコードだけに与えられます。

通常は、オブジェクト インスタンスのすべてのフィールドがシリアル化されます。これは、インスタンスのデータは、シリアル化されたデータで表されることを意味します。メンバのアクセシビリティとは無関係に、コードが形式を変換して、データがどのような値であるかを知ることは可能です。同様に、逆シリアル化では、シリアル化された形式からデータを抽出し、オブジェクトの状態を直接設定できます。これも、アクセシビリティの規則とは無関係です。

機密データを含むオブジェクトは、可能であれば、シリアル化できないようにしてください。シリアル化が必要な場合は、機密データを保持する特定のフィールドをシリアル化できないようにします。これができない場合は、シリアル化の許可を持つ任意のコードにデータが公開されることを認識し、悪意のあるコードがこの許可を取得しないように注意が必要です。

ISerializable インターフェイスは、シリアル化インフラストラクチャだけで使用されることを目的としています。ただし、保護されていないと、これが機密情報を公開してしまう可能性があります。ISerializable を実装することによってカスタムのシリアル化を提供する場合は、次の点に注意してください。

  • SerializationFormatter アクセス許可を指定して SecurityPermission を要求するか、またはメソッドの出力と共に機密情報を渡さないことによって、GetObjectData メソッドを明示的に安全にします。たとえば、次のようにします。

    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)
    {
    }
    
  • シリアル化に使用される専用のコンストラクタは入力の完全な検証も行うので、悪意のあるコードによる誤用から保護できるようにするため、保護するかプライベートにします。クラス ファクトリを通じてクラスを明示的または間接的に作成するなどの方法で、このようなクラスのインスタンスを取得するには、同じセキュリティ チェックを強制し、アクセス許可を要求することが必要です。

参照

その他の技術情報

安全なコーディングのガイドライン