SlideShare a Scribd company logo
1 of 10
Effective Java 輪読会第9回 
(項目76) 
2014/3/12 
開発部野口
項目76 防御的にreadObject を書く
readObject は 
もう1 つのpublic コンストラクタ 
 よって、以下の指針がreadObject にも当ては 
まる 
 項目38 パラメータの正当性を検査する 
 項目39 必要な場合には、防御的にコピーする
パラメータの正当性を検査する 
 入力バイトストリームを直接編集することによって、任 
意の値を持ったオブジェクトを生成できてしまう! 
(pp.292) 
 ので、defaultReadObject の呼び出し後に正当性検査を 
行うreadObject メソッドを提供する 
private void readObject(ObjectInputStream s) 
throws IOException, ClassNotFoundException { 
↓ 
s.defaultReadObject(); 
// 不変式が満足されているかどうかを検査する 
if (start.compareTo(end) > 0) 
throw new InvalidObjectException(start + " after " + end); 
}
不正オブジェクト参照 
 シリアライズしたバイト列のあとに特定のバ 
イト列を追加し、そのバイト列をreadObject 
でディシリアライズすることによって、 
Period オブジェクト内部のDate フィールド 
への参照を取得することができる!(pp.293- 
294) 
 (この辺詳しくは、「Java オブジェクト直列化 
仕様」を読みましょう)
不正オブジェクト参照への対処: 
防御的にコピーする 
private void readObject(ObjectInputStream s) 
throws IOException, ClassNotFoundException { 
s.defaultReadObject(); 
// 可変要素を防御的にコピーする 
start = new Date(start.getTime()); 
end = new Date(end.getTime()); 
// 不変式が満足されているかを検査する 
if (start.compareTo(end) > 0) 
throw new InvalidObjectException(start + " after " + end); 
}
防御的コピーについての諸注意 
 正当性検査は防御的コピーの後に行う 
 先に行うと、TOCTOU 攻撃にさらされる(参照: 項 
目39) 
 clone メソッドを使用しない 
 clone は、不正なサブクラスを返すことができる(参 
照: 項目39) 
 (残念ながら)フィールドをfinal にすることは 
できない 
 防御的コピーの代わりにwriteUnshared / 
readUnshared を使用しない(参照: 項目77 の問 
題が生じる)
デフォルトのreadObject を 
使用できるか? 
 「オブジェクト内のtransient ではない個々の 
フィールドに対する値をパラメータとして受 
け取り、それらの値を正当性検査をすること 
なくフィールドに保存するpublic のコンスト 
ラクタ」を追加することを快く感じるか 
 感じなければ、明示的なreadObject メソッドを 
提供し、コンストラクタと同等の正当性検査と防 
御的コピーを行う 
 あるいは、シリアライズ・プロキシ・パターンを用い 
る(参照: 項目78)
readObject では、オーバーライド可能 
なメソッドを呼び出さない 
 「項目17 継承のために設計および文書化する、 
でなければ継承を禁止する」で示されたもの 
と同様の問題があります 
 サブクラスの状態がディシリアライズされる前に 
実行される
まとめ 
 private でなければならないオブジェクト参照 
フィールドを持つクラスでは、それらを防御的に 
コピーする 
 (防御的コピーの後に)不変式を検査し、失敗し 
た場合はInvalidObjectException をスローする 
 ディシリアライズされた後にオブジェクトグラフ 
全体の正当性を検査したければ、 
ObjectInputValidation インタフェースを使用する 
 (この辺詳しくは、「Java オブジェクト直列化仕 
様」を読みましょう) 
 クラス内のオーバーライド可能なメソッドを呼び 
出さない

More Related Content

Viewers also liked

Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Appresso Engineering Team
 
マルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Executionマルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded ExecutionAppresso Engineering Team
 
Java9 and Project Jigsaw
Java9 and Project JigsawJava9 and Project Jigsaw
Java9 and Project Jigsawtakezoe
 
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShellAmazon Web Services Japan
 

Viewers also liked (10)

Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70
 
Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加
 
Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62
 
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44
 
Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52
 
マルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Executionマルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Execution
 
20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)
 
Java9 and Project Jigsaw
Java9 and Project JigsawJava9 and Project Jigsaw
Java9 and Project Jigsaw
 
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
 

More from Appresso Engineering Team

Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Appresso Engineering Team
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Appresso Engineering Team
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Appresso Engineering Team
 
Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Appresso Engineering Team
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Appresso Engineering Team
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Appresso Engineering Team
 
Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Appresso Engineering Team
 
Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Appresso Engineering Team
 
Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12Appresso Engineering Team
 
Effective java 輪読会 第3章 項目8,9,10
Effective java 輪読会 第3章 項目8,9,10Effective java 輪読会 第3章 項目8,9,10
Effective java 輪読会 第3章 項目8,9,10Appresso Engineering Team
 
Effective java 輪読会 第2章 項目5,6,7
Effective java 輪読会 第2章 項目5,6,7Effective java 輪読会 第2章 項目5,6,7
Effective java 輪読会 第2章 項目5,6,7Appresso Engineering Team
 

More from Appresso Engineering Team (14)

Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)
 
Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59
 
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
 
Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25
 
Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22
 
Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17
 
Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12
 
Effective java 輪読会 第3章 項目8,9,10
Effective java 輪読会 第3章 項目8,9,10Effective java 輪読会 第3章 項目8,9,10
Effective java 輪読会 第3章 項目8,9,10
 
Effective java 輪読会 第2章 項目5,6,7
Effective java 輪読会 第2章 項目5,6,7Effective java 輪読会 第2章 項目5,6,7
Effective java 輪読会 第2章 項目5,6,7
 

Recently uploaded

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (10)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

Effective Java 輪読会 項目76

  • 1. Effective Java 輪読会第9回 (項目76) 2014/3/12 開発部野口
  • 3. readObject は もう1 つのpublic コンストラクタ  よって、以下の指針がreadObject にも当ては まる  項目38 パラメータの正当性を検査する  項目39 必要な場合には、防御的にコピーする
  • 4. パラメータの正当性を検査する  入力バイトストリームを直接編集することによって、任 意の値を持ったオブジェクトを生成できてしまう! (pp.292)  ので、defaultReadObject の呼び出し後に正当性検査を 行うreadObject メソッドを提供する private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { ↓ s.defaultReadObject(); // 不変式が満足されているかどうかを検査する if (start.compareTo(end) > 0) throw new InvalidObjectException(start + " after " + end); }
  • 5. 不正オブジェクト参照  シリアライズしたバイト列のあとに特定のバ イト列を追加し、そのバイト列をreadObject でディシリアライズすることによって、 Period オブジェクト内部のDate フィールド への参照を取得することができる!(pp.293- 294)  (この辺詳しくは、「Java オブジェクト直列化 仕様」を読みましょう)
  • 6. 不正オブジェクト参照への対処: 防御的にコピーする private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); // 可変要素を防御的にコピーする start = new Date(start.getTime()); end = new Date(end.getTime()); // 不変式が満足されているかを検査する if (start.compareTo(end) > 0) throw new InvalidObjectException(start + " after " + end); }
  • 7. 防御的コピーについての諸注意  正当性検査は防御的コピーの後に行う  先に行うと、TOCTOU 攻撃にさらされる(参照: 項 目39)  clone メソッドを使用しない  clone は、不正なサブクラスを返すことができる(参 照: 項目39)  (残念ながら)フィールドをfinal にすることは できない  防御的コピーの代わりにwriteUnshared / readUnshared を使用しない(参照: 項目77 の問 題が生じる)
  • 8. デフォルトのreadObject を 使用できるか?  「オブジェクト内のtransient ではない個々の フィールドに対する値をパラメータとして受 け取り、それらの値を正当性検査をすること なくフィールドに保存するpublic のコンスト ラクタ」を追加することを快く感じるか  感じなければ、明示的なreadObject メソッドを 提供し、コンストラクタと同等の正当性検査と防 御的コピーを行う  あるいは、シリアライズ・プロキシ・パターンを用い る(参照: 項目78)
  • 9. readObject では、オーバーライド可能 なメソッドを呼び出さない  「項目17 継承のために設計および文書化する、 でなければ継承を禁止する」で示されたもの と同様の問題があります  サブクラスの状態がディシリアライズされる前に 実行される
  • 10. まとめ  private でなければならないオブジェクト参照 フィールドを持つクラスでは、それらを防御的に コピーする  (防御的コピーの後に)不変式を検査し、失敗し た場合はInvalidObjectException をスローする  ディシリアライズされた後にオブジェクトグラフ 全体の正当性を検査したければ、 ObjectInputValidation インタフェースを使用する  (この辺詳しくは、「Java オブジェクト直列化仕 様」を読みましょう)  クラス内のオーバーライド可能なメソッドを呼び 出さない