1

セキュアコーディングサイトが説明しているように:

Blockquote 以下の違反コード例は、プライベート コンストラクタを持つクラス Ser を示しており、クラスの外部のコードがそのインスタンスを作成できないことを示している。このクラスは java.io.Serializable を実装し、パブリックな readObject() および writeObject() メソッドを定義します。したがって、信頼できないコードは、readObject() を使用して再構成されたオブジェクトを取得し、writeObject() を使用してストリームに書き込むことができます。

public class Ser implements Serializable {
  private final long serialVersionUID = 123456789;
  private Ser() {
    // initialize
  }
  public static void writeObject(final ObjectOutputStream stream)
    throws IOException {
    stream.defaultWriteObject();
  }
  public static void readObject(final ObjectInputStream stream)
      throws IOException, ClassNotFoundException {
    stream.defaultReadObject();
  }
}

ご存じのように、writeObject および readObject メソッドはプライベートとして定義する必要があり (また static キーワードなしで!)、これらのメソッドは JVM によって呼び出されません。

私の質問は、これらの方法が安全でない理由です。これらのメソッドは JVM によって呼び出されることさえありません!! このコードが安全でない可能性があり、攻撃者がデータにアクセスできることを示すサンプル コードが必要です。

どんな助けでも大歓迎です。

4

2 に答える 2

0

サイトが正しくありません。Object Serialization Specificationは、署名writeObject()

private void writeObject(ObjectOutputStream stream)
    throws IOException;

同様に、の署名readObject()

private void readObject(ObjectInputStream stream)
    throws IOException, ClassNotFoundException;

それらを作成しpublic ない staticと、呼び出されません。ここにそれらは両方あります。

于 2014-08-22T07:50:59.057 に答える