9.3. セキュリティ
9.3.1. 拡張子偽装検証
クライアントが送信した拡張子と実際のファイル内容のMIMEタイプを比較検証します。
java
public class FileValidator {
private final StorageProperties properties;
public void validate(MultipartFile file) {
String extension = extractExtension(file.getOriginalFilename());
// 1. 許可拡張子の検証
if (!properties.allowedExtensions().contains(extension)) {
throw new InvalidFileException("許可されていないファイル拡張子です: " + extension);
}
// 2. MIMEタイプの検証
String contentType = file.getContentType();
if (contentType == null || !properties.allowedMimeTypes().contains(contentType)) {
throw new InvalidFileException("許可されていないファイル形式です: " + contentType);
}
// 3. ファイルサイズの検証
if (file.getSize() > properties.maxFileSize()) {
throw new InvalidFileException("ファイルサイズが制限を超過しています。");
}
}
}9.3.2. Path Traversal 防止
ファイルパスに .. または絶対パスが含まれないように検証します。
java
public static void validatePath(String filename) {
if (filename.contains("..") || filename.contains("/") || filename.contains("\\")) {
throw new InvalidFileException("不正なファイル名です。");
}
}9.3.3. アクセス制御
- ファイルダウンロードAPIは 認証済みユーザーのみ がアクセスできなければなりません。
- 必要に応じて、ファイル所有者のみがダウンロードできるように権限検証を追加します。
- アップロードディレクトリにWebサーバーが直接アクセスしないように設定します。必ずAPIを通じてファイルを提供しなければなりません。
9.3.4. 禁止事項
| 禁止項目 | 理由 |
|---|---|
| アップロードディレクトリの静的ファイル配信 | Path Traversal、実行ファイルへのアクセスリスク |
| クライアント提供のファイル名をそのまま保存 | 特殊文字、重複、セキュリティリスク |
| 拡張子のみによるファイルタイプ検証 | 拡張子偽装が可能 |
| ファイルサイズの無制限許可 | DoS攻撃のリスク |