SlideShare uma empresa Scribd logo
1 de 18
Baixar para ler offline
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
class CatFile {
  public static void cat(File file) {            cat メソッドのなかで
      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) {                      cat メソッドや
             try {
               input.close();                        testCatFile クラスの
             } catch (IOException e) {
                 System.err.println(e.toString());   main メソッドで
             }
 }}}
                                                  throws 宣言する方法も
}                                                 あり.
class testCatFile {
  ... 以下省略 ...

                                        6
修正例その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 クラスで出力されるファイル
    OutFile.txt から整数を読み込み, その総和を計算す
 •FileWriter() が IOException をスローする可能性
    るコードを書け
 •elementAt() メソッドが
(C)データを読み込んだ後の OutFile.txt を削除するよ
  ArrayIndexOutOfBoundsException をスローする可能性
    うに修正せよ. 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 から整数を読み込み, その総和を計算す
  るコードを書け
(C)データを読み込んだ後のでは
   以下のコード例 sum.java OutFile.txt を削除するよ
   うに修正せよ. symlink 攻撃を防ぐにはどうすればよ
   •writeList() に対応して readList() をつくった
  いか?
  •main()メソッドで OutFile.txt を生成するところも
  一緒に入れた
                       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() メソッドの最初で, ファイル操作を行うディレクトリが
  セキュアディレクトリであることを確認 (具体的なコードにつ
(B) ListOfNumbers クラスで出力されるファイル
 いては FIO00-J を参照)
  OutFile.txt から整数を読み込み, その総和を計算す
 •main() メソッドの最後でファイルを削除
   るコードを書け
(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);

        File outfile = new File(FILENAME);
        outfile.delete();
    }
}


                                       18

Mais conteúdo relacionado

Mais procurados

ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用nagise
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会Takinami Kei
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 
Java8 Lambda chapter5
Java8 Lambda chapter5Java8 Lambda chapter5
Java8 Lambda chapter5Takinami Kei
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsFumitaka Yamada
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
Java puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanJava puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanYoshio Terada
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallnagise
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)taskie
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習JPCERT Coordination Center
 
DBFlute2017フェスLT資料
DBFlute2017フェスLT資料DBFlute2017フェスLT資料
DBFlute2017フェスLT資料shogokataoka
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。Satoshi Mimura
 
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リーリナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リーCODE BLUE
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream APIdcomsolution
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Yuichi Sakuraba
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うTatsumi Naganuma
 

Mais procurados (20)

Java7再入門講座
Java7再入門講座Java7再入門講座
Java7再入門講座
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 
Java8 Lambda chapter5
Java8 Lambda chapter5Java8 Lambda chapter5
Java8 Lambda chapter5
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to Objects
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Java puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanJava puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta Japan
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第1回 演習
 
DBFlute2017フェスLT資料
DBFlute2017フェスLT資料DBFlute2017フェスLT資料
DBFlute2017フェスLT資料
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リーリナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 

Destaque

Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説JPCERT Coordination Center
 
Lec 04 program development and programming languages
Lec 04 program development and programming languagesLec 04 program development and programming languages
Lec 04 program development and programming languagesRamy Eltarras
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)JPCERT Coordination Center
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」JPCERT Coordination Center
 

Destaque (7)

Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説
 
Lec 04 program development and programming languages
Lec 04 program development and programming languagesLec 04 program development and programming languages
Lec 04 program development and programming languages
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
Android Secure Coding
Android Secure CodingAndroid Secure Coding
Android Secure Coding
 
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
 

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

Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第2回演習
Javaセキュアコーディングセミナー東京第2回演習Javaセキュアコーディングセミナー東京第2回演習
Javaセキュアコーディングセミナー東京第2回演習JPCERT Coordination Center
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】Yukiko Kato
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すAromaBlack
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門kamukiriri
 
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...Masahiro Sakai
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
ゆるふわJava8入門
ゆるふわJava8入門ゆるふわJava8入門
ゆるふわJava8入門dcubeio
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development lifeUehara Junji
 

Semelhante a Javaセキュアコーディングセミナー東京第3回演習の解説 (20)

Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 
Javaセキュアコーディングセミナー東京第2回演習
Javaセキュアコーディングセミナー東京第2回演習Javaセキュアコーディングセミナー東京第2回演習
Javaセキュアコーディングセミナー東京第2回演習
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】
 
Project lambda
Project lambdaProject lambda
Project lambda
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門
 
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Task
TaskTask
Task
 
Rakuten tech conf
Rakuten tech confRakuten tech conf
Rakuten tech conf
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
ゆるふわJava8入門
ゆるふわJava8入門ゆるふわJava8入門
ゆるふわJava8入門
 
20071030
2007103020071030
20071030
 
pecl-AOPの紹介
pecl-AOPの紹介pecl-AOPの紹介
pecl-AOPの紹介
 
Enshu8
Enshu8Enshu8
Enshu8
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 

Mais de JPCERT Coordination Center

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~JPCERT Coordination Center
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)JPCERT Coordination Center
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』JPCERT Coordination Center
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)JPCERT Coordination Center
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...JPCERT Coordination Center
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策JPCERT Coordination Center
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルJPCERT Coordination Center
 
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesLessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesJPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)JPCERT Coordination Center
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JPCERT Coordination Center
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性JPCERT Coordination Center
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性JPCERT Coordination Center
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性JPCERT Coordination Center
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性JPCERT Coordination Center
 

Mais de JPCERT Coordination Center (20)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
 
DLL読み込みの問題を読み解く
DLL読み込みの問題を読み解くDLL読み込みの問題を読み解く
DLL読み込みの問題を読み解く
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
 
クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策クロスサイトリクエストフォージェリ(CSRF)とその対策
クロスサイトリクエストフォージェリ(CSRF)とその対策
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesLessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
 
Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
 
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
 
Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性Blojsom におけるクロスサイトスクリプティングの脆弱性
Blojsom におけるクロスサイトスクリプティングの脆弱性
 

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

  • 2. ‣Hands-on Exercises ‣ コンパイルエラーに対処しよう ‣ ファイルからのデータ入力を実装しよう 2
  • 3. Hands-on Exercise(1) サンプルコードの コンパイルエラーに対処しよう 3
  • 4. 以下のコードをコンパイルできるように修正せよ. 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
  • 5. コンパイルすると... $ 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
  • 6. 修正例その1 class CatFile { public static void cat(File file) { cat メソッドのなかで 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) { cat メソッドや try { input.close(); testCatFile クラスの } catch (IOException e) { System.err.println(e.toString()); main メソッドで } }}} throws 宣言する方法も } あり. class testCatFile { ... 以下省略 ... 6
  • 7. 修正例その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
  • 8. Hands-on Exercise(2) (A)以下の testListOfNumbers.java について、コンパイル 実行できるようにコードを修正せよ (B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計算す るコードを書け (C)データを読み込んだ後の OutFile.txt を削除するよ うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 8
  • 9. 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
  • 10. 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
  • 11. testListOfNumbers.java (3/3) class testListOfNumbers { public static void main(String[] args){ ListOfNumbers lon = new ListOfNumbers(); lon.writeList(); } } 11
  • 12. Hands-on Exercise(2) (A)以下の testListOfNumbers.java について、コンパイル 実行できるようにコードを修正せよ (B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計算す •FileWriter() が IOException をスローする可能性 るコードを書け •elementAt() メソッドが (C)データを読み込んだ後の OutFile.txt を削除するよ ArrayIndexOutOfBoundsException をスローする可能性 うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 12
  • 13. 修正例 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
  • 14. Hands-on Exercise(2) (A)以下の testListOfNumbers.java について、コンパイル 実行できるようにコードを修正せよ (B) ListOfNumbers クラスで出力されるファイル OutFile.txt から整数を読み込み, その総和を計算す るコードを書け (C)データを読み込んだ後のでは 以下のコード例 sum.java OutFile.txt を削除するよ うに修正せよ. symlink 攻撃を防ぐにはどうすればよ •writeList() に対応して readList() をつくった いか? •main()メソッドで OutFile.txt を生成するところも 一緒に入れた 14
  • 15. コード例 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
  • 16. コード例 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
  • 17. Hands-on Exercise(2) (A)以下の testListOfNumbers.java について、コンパイル 以下のコード例 sum1.java では 実行できるようにコードを修正せよ •main() メソッドの最初で, ファイル操作を行うディレクトリが セキュアディレクトリであることを確認 (具体的なコードにつ (B) ListOfNumbers クラスで出力されるファイル いては FIO00-J を参照) OutFile.txt から整数を読み込み, その総和を計算す •main() メソッドの最後でファイルを削除 るコードを書け (C)データを読み込んだ後の OutFile.txt を削除するよ うに修正せよ. symlink 攻撃を防ぐにはどうすればよ いか? 17
  • 18. コード例 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); File outfile = new File(FILENAME); outfile.delete(); } } 18