私は Java サーバーの実装 (問題がある場合は TFTP) を使用しており、利用できないファイルや場所へのアクセスを許可するパス トラバーサル攻撃の影響を受けないようにしたいと考えています。
これまでの防御における私の最善の試みは、一致するすべてのエントリを拒否し、パスからコンポーネントを解決することFile.isAbsolute()
に依存することです。最後に、結果のパスがまだサーバーの必要なルート ディレクトリ内にあることを確認します。File.getCanonicalPath()
../
./
public String sanitize(final File dir, final String entry) throws IOException {
if (entry.length() == 0) {
throw new PathTraversalException(entry);
}
if (new File(entry).isAbsolute()) {
throw new PathTraversalException(entry);
}
final String canonicalDirPath = dir.getCanonicalPath() + File.separator;
final String canonicalEntryPath = new File(dir, entry).getCanonicalPath();
if (!canonicalEntryPath.startsWith(canonicalDirPath)) {
throw new PathTraversalException(entry);
}
return canonicalEntryPath.substring(canonicalDirPath.length());
}
これが見逃しているセキュリティ上の問題はありますか? 同じ結果を確実に達成するためのより良い/より速いものはありますか?
コードは、Windows と Linux で一貫して機能する必要があります。