Skip to content

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攻撃のリスク

TIENIPIA QUALIFIED STANDARD