Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら RSSフィードのご登録はこちらから
公開日:2013年3月20日
最終更新日:2020年8月13日

ディレクトリ・トラバーサル対策(Java編)

ディレクトリ・トラバーサルの対策は以下の記事を参照してください。

この一部を Java で実現すると以下のようになります。

根本的対策

■ファイルを開く場合は、固定ディレクトリ+ファイル名にする
java.io.Fileクラスを利用してファイル名を取得後、ディレクトリと結合してパスを作成します。

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringEscapeUtils;

public class DirectoryTraversal extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String DIRECTORY_PATH = "C:\\Files\\";

    //ファイル名取得
    String fileName = (new File("..\\..\\..\\hosts")).getName();

    //パス結合
    String path = (new File(DIRECTORY_PATH, fileName)).getPath();

    //出力して確認
    resp.setContentType("text/html; charset=UTF-8");
    PrintWriter out = resp.getWriter();
    out.println("<html><body>");
    out.println(StringEscapeUtils.escapeHtml4(path));
    out.println("</body></html>");
    out.close();
  }
}

出力結果は以下のようになります。

C:\Files\hosts

保険的対策

■ファイル名のチェックを行う
正規表現で、パスに含まれる「/」、「../」、「..\」をチェックします。

import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringEscapeUtils;

public class DirectoryTraversal extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //ファイル名
    String fileName = "..\\..\\..\\hosts";

    //正規表現でチェック
    String regex = "(/|\\.\\./|\\.\\.\\\\)";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(fileName);

    //結果
    String result = matcher.find() ? "true" : "false";

    //出力して確認
    resp.setContentType("text/html; charset=UTF-8");
    PrintWriter out = resp.getWriter();
    out.println("<html><body>");
    out.println(StringEscapeUtils.escapeHtml4(result));
    out.println("</body></html>");
    out.close();
  }
}

出力結果は以下のようになります。

true

参考

Webアプリケーションセキュリティに関する記事は、以下のページにまとまっています。ぜひご確認ください。


スポンサーリンク





カテゴリー:Webアプリケーションセキュリティ対策

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA