JavaA2Z

KAB-studio > プログラミング > JavaA2Z > ディレクトリトラバーサルとは

ディレクトリトラバーサル

日本語 住所録横断
英語 directory traversal
ふりがな でぃれくとりとらばーさる
フリガナ ディレクトリトラバーサル

解説

ファイルの指定時に、「..」を使用して本来アクセスしてはならないファイルがアクセスされてしまうこと。
セキュリティホールの一種。「ディレクトリトラバース」とも言う。
 
ユーザーからファイル名等を指定してもらい、そのファイル名に基づいてディスク上のファイルにアクセスする場合に、「..」を使用されると「アクセスするディレクトリの上位のディレクトリ」にアクセスされてしまう可能性があり、それにより重要なファイルが閲覧されてしまったり上書きされてしまう。これが「ディレクトリトラバーサル」というセキュリティホールである。
 
ディレクトリトラバーサルを防ぐためには、「..」が含まれているかどうかチェックするなどの方法がある。また、特定のディレクトリ下にのみアクセスさせる場合には、FileクラスのgetCanonicalPath()メソッドを使用して「..」を解決した後の絶対パスを取得し比較する方法もある。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.io.File;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        // たとえばファイル名を画面から入力してもらった場合。
        String inputFilename = "test.txt";
        // これをそのまま使うのは危険です。
        File file = new File( inputFilename );

        // この「画面から入力されたファイル名」に「..」が
        // 含まれていると……。
        inputFilename = "../data/pass.txt";
        file = new File( inputFilename );
        // この場合、もし「data」ディレクトリに「pass.txt」があって
        // その中にユーザー情報が含まれていたりしたら、その情報に
        // アクセスされてしまいます。
        // 実際には、OSや使用しているアプリケーションからこういった
        // ディレクトリやファイル名を想定したり、もしくは辞書から
        // ランダムに組み合わせて使用したりして、手当たり次第調べる
        // プログラムで試みてきます。

        try
        {
            // FileクラスのgetCanonicalPath()メソッドを使うと、
            // ..を解決した絶対パスを取得できます。
            System.out.println( new File( "." ).getCanonicalPath() );
            System.out.println( file.getCanonicalPath() );
            // D:\Sample
            // D:\data\pass.txt

            // このように、getCanonicalPath()メソッドを使用すれば
            // ..を解決した絶対パスが得られるので、これを使って
            // 「指定したディレクトリ下にあるか」を調べれば
            // いいでしょう。
        }
        catch( IOException e )
        {
            // エラーが発生すると例外が投げられます。
            e.printStackTrace();
        }
    }
}
// Sample.java
import java.io.File;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        // たとえばファイル名を画面から入力してもらった場合。
        String inputFilename = "test.txt";
        // これをそのまま使うのは危険です。
        File file = new File( inputFilename );

        // この「画面から入力されたファイル名」に「..」が
        // 含まれていると……。
        inputFilename = "../data/pass.txt";
        file = new File( inputFilename );
        // この場合、もし「data」ディレクトリに「pass.txt」があって
        // その中にユーザー情報が含まれていたりしたら、その情報に
        // アクセスされてしまいます。
        // 実際には、OSや使用しているアプリケーションからこういった
        // ディレクトリやファイル名を想定したり、もしくは辞書から
        // ランダムに組み合わせて使用したりして、手当たり次第調べる
        // プログラムで試みてきます。

        try
        {
            // FileクラスのgetCanonicalPath()メソッドを使うと、
            // ..を解決した絶対パスを取得できます。
            System.out.println( new File( "." ).getCanonicalPath() );
            System.out.println( file.getCanonicalPath() );
            // D:\Sample
            // D:\data\pass.txt

            // このように、getCanonicalPath()メソッドを使用すれば
            // ..を解決した絶対パスが得られるので、これを使って
            // 「指定したディレクトリ下にあるか」を調べれば
            // いいでしょう。
        }
        catch( IOException e )
        {
            // エラーが発生すると例外が投げられます。
            e.printStackTrace();
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

「サンプルプログラムとか」に含まれているページ

  • (参照している単語はありません)
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/07/23
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。