Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

Similar documents
Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

オブジェクト指向プログラミング・同演習 5月21日演習課題

Prog2_9th

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1


Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Prog2_10th

K227 Java 2

r1.dvi

デジタル表現論・第6回

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Programming-C-9.key

Prog1_10th

Javaセキュアコーディングセミナー東京 第4回 メソッドとセキュリティ 演習解説

メソッドのまとめ

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

新・明解Java入門

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

JavaプログラミングⅠ

2

Microsoft PowerPoint ppt

Prog1_11th

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

GEC-Java


プログラムの基本構成

プログラミング入門1

GEC-Java

例外処理とファイル入出力

JavaプログラミングⅠ

Prog1_15th

プログラミング入門1

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

PowerPoint プレゼンテーション

I java A

問題1 以下に示すプログラムは、次の処理をするプログラムである

2

プログラミングA

データ構造とアルゴリズム論

Program Design (プログラム設計)

2

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

JavaプログラミングⅠ

PowerPoint Presentation

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 3 回コレクションと例外処理 テクノロジックアート 瀬嘉秀

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

Microsoft Word - keisankigairon.ch doc

JavaプログラミングⅠ

Microsoft PowerPoint - OOP.pptx

プログラミング入門1

Web 1 p.2 1 Servlet Servlet Web Web Web Apache Web Servlet JSP Web Apache Tomcat Jetty Apache Tomcat, Jetty Java JDK, Eclipse

プログラミング入門1

PowerPoint Presentation

II 1 p.1 1 Servlet 1.1 Web Web WWW HTML CGI Common Gateway Interface Web HTML Web Web CGI CGI CGI Perl, PHP C JavaScript Web CGI HTML 1.2 Servlet Java

マークアップ言語

JAVA とテンプレート

Microsoft PowerPoint - prog13.ppt

Microsoft PowerPoint - prog13.ppt

データ構造とアルゴリズム論

Java講座

JavaプログラミングⅠ

PowerPoint Presentation

JavaプログラミングⅠ

Java知識テスト問題

2

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

JAVA 11.4 PrintWriter 11.5

PowerPoint プレゼンテーション

File IO

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

JavaプログラミングⅠ

PowerPoint Presentation

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

デジタル表現論・第4回

HTML Java Tips dp8t-asm/java/tips/ Apache Tomcat Java if else f

GEC-Java

JavaプログラミングⅠ

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

IE6 2 BMI chapter1 Java 6 chapter2 Java 7 chapter3 for if 8 chapter4 : BMI 9 chapter5 Java GUI 10 chapter6 11 chapter7 BMI 12 chap

Microsoft PowerPoint - prog03.ppt

試験問題に記載されている会社名又は製品名は, それぞれ各社の商標又は登録商標です なお, 試験問題では, 及び TM を明記していません

ex01.dvi

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Exam : 1z0-809 日本語 (JPN) Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO 1 / 8 Get Latest & Valid 1z0-809-JPN Exam's Question and Answe

HTML Java Tips dp8t-asm/java/tips/ Apache Tomcat Java if else f

Week 1 理解度確認クイズ解答 解説 問題 1 (4 2 点 =8 点 ) 以下の各問いに答えよ 問題 bit 版の Windows8.1 に Java をインストールする時 必要なパッケージはどれか 但し Java のコンパイルができる環境をインストールするものとする 1. jdk

人工知能入門

スライド 1

Prog1_13th

目 次 Java GUI 3 1 概要 クラス構成 ソースコード例 課題...7 i

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

Java言語 第1回

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

Transcription:

Java セキュアコーディングセミナー東京第 3 回入出力と例外時の動作 演習解説 2012 年 11 月 11 日 ( 日 ) JPCERT コーディネーションセンター脆弱性解析チーム戸田洋三 1

Hands-on Exercises コンパイルエラーに対処しよう ファイルからのデータ入力を実装しよう 2

Hands-on Exercise(1) サンプルコードの コンパイルエラーに対処しよう 3

以下のコードをコンパイルできるように修正せよ. class CatFile { public static void cat(file file) { RandomAccessFile input = null; String line = null; try { input = new RandomAccessFile(file, "r"); while ((line = input.readline())!= null) { System.out.println(line); return; finally { if (input!= null) { input.close(); class testcatfile { public static void main(string[] args){ if (args.length >= 1) { CatFile.cat(new File(args[0])); 4

コンパイルすると... $ javac testcatfile_cantcompile.java testcatfile_cantcompile.java:19: error: unreported exception IOException; must be caught or declared to be thrown input.close(); ^ testcatfile_cantcompile.java:12: error: unreported exception FileNotFoundException; must be caught or declared to be thrown input = new RandomAccessFile(file, "r"); ^ testcatfile_cantcompile.java:13: error: unreported exception IOException; must be caught or declared to be thrown while ((line = input.readline())!= null) { ^ 3 errors $ チェック例外である IOException と FileNotFoundException の扱いを記述する 必要がある. 5

修正例その 1 6 class CatFile { public static void cat(file file) { RandomAccessFile input = null; String line = null; try { input = new RandomAccessFile(file, "r"); while ((line = input.readline())!= null) { System.out.println(line); return; catch (FileNotfoundException e){ System.err.println(e.toString()); catch (IOException e){ System.err.println(e.toString()); finally { if (input!= null) { try { input.close(); catch (IOException e){ System.err.println(e.toString()); class testcatfile { 以下省略 cat メソッドのなかで例外を処理する修正例. cat メソッドや testcatfile クラスの main メソッドで throws 宣言する方法もあり.

修正例その 2(JavaSE7) class CatFile { public static void cat(file file) { try (RandomAccessFile input = new RandomAccessFile(file, "r"); ) { String line = null; while ((line = input.readline())!= null) { System.out.println(line); return; catch (FileNotFoundException e) { System.err.println(e.toString()); catch (IOException e) { System.err.println(e.toString()); try-with-resource 構文を使うことで, 明示的に close() を呼び出す必要がなくなる. 7

Hands-on Exercise(2) (A) 以下の testlistofnumbers.java について コ ンパイル実行できるようにコードを修正せよ. (B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計 算するコードを書け. (C) データを読み込んだ後の OutFile.txt を削除す るように修正せよ. symlink 攻撃を防ぐにはど うすればよいか? 8

testlistofnumbers.java (1/3) /* * Copyright (c) 1995, 2008, Oracle and/or its affiliates. * All rights reserved. */ import java.io.*; import java.util.vector; class ListOfNumbers { private Vector<Integer> victor; private static final int SIZE = 10; public ListOfNumbers () { victor = new Vector<Integer>(SIZE); for (int i = 0; i < SIZE; i++) victor.addelement(new Integer(i)); 9

testlistofnumbers.java (2/3) public void writelist() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println(victor.elementat(i)); finally { if (out!= null) { System.out.println("Closing PrintWriter"); out.close(); else { System.out.println("PrintWriter not open"); 10

testlistofnumbers.java (3/3) class testlistofnumbers { public static void main(string[] args){ ListOfNumbers lon = new ListOfNumbers(); lon.writelist(); 11

Hands-on Exercise(2) (A) 以下の testlistofnumbers.java について コ ンパイル実行できるようにコードを修正せよ. (B) ListOfNumbers クラスで出力されるファイル FileWriter() が IOException をスローする可能性 OutFile.txt から整数を読み込み, その総和を計 elementat() が ArrayIndexOutOfBoundsException を 算するコードを書け. スローする可能性 (C) データを読み込んだ後の OutFile.txt を削除す るように修正せよ. symlink 攻撃を防ぐにはど うすればよいか? 12

修正例 : writelist() public void writelist() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println(victor.elementat(i)); catch (ArrayIndexOutOfBoundsException e){ System.err.println( Caught ArrayIndexOutOfboundsException: + e.getmessage()); catch (IOException e){ System.err.println( Caught IOException: + e.getmessage()); finally { if (out!= null) { System.out.println("Closing PrintWriter"); out.close(); else { System.out.println("PrintWriter not open"); 13

Hands-on Exercise(2) (A) 以下の testlistofnumbers.java について コ ンパイル実行できるようにコードを修正せよ. (B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計 算するコードを書け. 以下のコード例 sum.java では writelist() に対応して (C) データを読み込んだ後の OutFile.txt を削除す readlist() をつくった. main() メソッドで OutFile.txt を るように修正せよ. symlink 攻撃を防ぐにはど 生成するところも一緒に入れた. うすればよいか? 14

コード例 sum.java (1/2) /* * sum.java * call ListNumbers to generate outfile.txt * read outfile.txt and compute and print the sum of the numbers */ class readlist { public Vector<Integer> readlist(string filename) throws IOException { Vector<Integer> victor = new Vector<Integer>(); try ( BufferedReader in = new BufferedReader(new FileReader(filename)); ) { String line; while ((line = in.readline())!= null) { victor.addelement(integer.parseint(line)); return victor; 15

コード例 sum.java (2/2) class sum { private static final String FILENAME = OutFile.txt ; public static void main(string[] args) throws IOException { ListOfNumbers lon = new ListOfNumbers(); lon.writelist(); // file generated System.out.println( reading... ); readlist rl = new readlist(); Vector<Integer> v = rl.readlist(filename); Integer total = 0; for (Integer i : v){ total = total + i; System.out.println( total: + total); 16

Hands-on Exercise(2) (A) 以下の testlistofnumbers.java について コ 以下のコード例 sum1.java では ンパイル実行できるようにコードを修正せよ. main() メソッドの最初で, ファイル操作を行うディレ クトリがセキュアディレクトリであることを確認 具体的なコードについては FIO-00J を参照 (B) ListOfNumbers クラスで出力されるファイル main() メソッドの最後でファイルを削除 OutFile.txt から整数を読み込み, その総和を計 算するコードを書け. (C) データを読み込んだ後の OutFile.txt を削除す るように修正せよ. symlink 攻撃を防ぐにはど うすればよいか? 17

コード例 sum1.java class sum1 { private static final String FILENAME = OutFile.txt ; public static void main(string[] args) throws IOException { // まず最初にカレントディレクトリがセキュアディレクトリであることを確認する // Java セキュアコーディングスタンダード FIO00-J で紹介している // isinsecuredir() メソッドを参照 (POSIX 系のファイルシステムの場合 ) // https://www.jpcert.or.jp/java-rules/fio00-j.html ListOfNumbers lon = new ListOfNumbers(); lon.writelist(); // file generated System.out.println( reading... ); readlist rl = new readlist(); Vector<Integer> v = rl.readlist(filename); Integer total = 0; for (Integer i : v){ total = total + i; System.out.println( total: + total); 18 File outfile = new File(FILENAME); outfile.delete();