Windowsでファイル名の末尾ドットが無視される挙動の由来
Windows10において、mydir
という名前のディレクトリ、myfile.txt
というファイルが存在するとき、Javaの
Files.exists(Paths.get("mydir.")); // 1個の末尾ドットが無視される?(2個以上はfalse)
Files.exists(Paths.get("myfile.txt...")); // 1個以上の末尾ドットが無視される?
が真となるのですが、なぜこのような挙動になるのでしょうか。
また、正しく(つまりmydir.
,myfile.txt.
は存在しない、と)判断できるようにするためにはどうすべきでしょうか。
ちなみに、C#で試したところ
Directory.Exists("mydir...."); // 1個以上
File.Exists("myfile.txt.........."); // 1個以上
が真となりました。(ディレクトリ存在の判断が異なるのも少し気になります…)
Java/C#ともCentOS7上では偽となっていました。
[以下補足情報]
Webサーバに対するディレクトリトラバーサル攻撃というのは、一般的には親方向にトラバースさせると思いますが、この挙動を利用すると子方向へのトラバース可能性も出てくるかと思います。
例えば、Java Servlet仕様(JSR 369: Java Servlet 4.0 Specification 10.5 Directory Structure)によると /WEB-INF
ディレクトリ以下への直接のリクエストは拒否されるべきですが、後ろにドットを付け、 http://example.com/WEB-INF./web.xml (あるいは小文字で http://example.com/web-inf./web.xml )とすることで該当ディレクトリ以下のファイルが漏洩する脆弱性が過去実際にあったようです(Tomcat, WildFly)。