公開日:2013年3月20日
最終更新日:2020年8月13日
最終更新日: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アプリケーションセキュリティ対策
コメントを残す