ディレクトリトラバーサル
| 日本語 | 住所録横断 |
| 英語 | directory traversal |
| ふりがな | でぃれくとりとらばーさる |
| フリガナ | ディレクトリトラバーサル |
ファイルの指定時に、「..」を使用して本来アクセスしてはならないファイルがアクセスされてしまうこと。
セキュリティホールの一種。「ディレクトリトラバース」とも言う。
ユーザーからファイル名等を指定してもらい、そのファイル名に基づいてディスク上のファイルにアクセスする場合に、「..」を使用されると「アクセスするディレクトリの上位のディレクトリ」にアクセスされてしまう可能性があり、それにより重要なファイルが閲覧されてしまったり上書きされてしまう。これが「ディレクトリトラバーサル」というセキュリティホールである。
ディレクトリトラバーサルを防ぐためには、「..」が含まれているかどうかチェックするなどの方法がある。また、特定のディレクトリ下にのみアクセスさせる場合には、FileクラスのgetCanonicalPath()メソッドを使用して「..」を解決した後の絶対パスを取得し比較する方法もある。
セキュリティホールの一種。「ディレクトリトラバース」とも言う。
ユーザーからファイル名等を指定してもらい、そのファイル名に基づいてディスク上のファイルにアクセスする場合に、「..」を使用されると「アクセスするディレクトリの上位のディレクトリ」にアクセスされてしまう可能性があり、それにより重要なファイルが閲覧されてしまったり上書きされてしまう。これが「ディレクトリトラバーサル」というセキュリティホールである。
ディレクトリトラバーサルを防ぐためには、「..」が含まれているかどうかチェックするなどの方法がある。また、特定のディレクトリ下にのみアクセスさせる場合には、FileクラスのgetCanonicalPath()メソッドを使用して「..」を解決した後の絶対パスを取得し比較する方法もある。
参考サイト
// 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();
}
}
}
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();
}
}
}
「みだし」に含まれているページ
「解説」に含まれているページ
「サンプルプログラムとか」に含まれているページ
- (参照している単語はありません)




