パブリックなPOST APIと画像のセキュリティー
Photo by Dan Nelson on Unsplash
最近、パブリックなPOST APIを実装する機会があり、セキュリティ面を調べているうちに、かつての面接で出た「画像アップロードをどう守る?」という質問を思い出しました。当時は FormData やリクエストヘッダーをチェックするくらいしか思いつかず答えに詰まってしまいましたが、改めて考え直すと、今ならこう答えます。
1. 画像をフォームとは別にアップロード
- クライアントから直接 S3 のプリサインドURL を取得
- 画像ファイルをその URL に PUT で送信
- フォーム送信時には、画像のオブジェクトキーだけを含める
こうすることで、アプリ側のサーバー処理とストレージが分離し、権限管理がシンプルになります。
2. 送信前・送信後にファイルをスキャン
- クライアント側:Base64エンコード文字列を正規表現でチェックし、不審なスクリプトパターンを早期にブロック
- サーバー側:S3へ保存されたバイナリを再度検査(マルウェアスキャンや拡張子偽装検出ツールを利用)
これにより、いわゆる「シェルショック」や「悪意あるスクリプト挿入」といったリスクを低減できます。
まとめ
- 分離されたアップロードフロー → 権限管理が明瞭
- 多層的なスキャン → クライアント・サーバー双方で安全性を担保
セキュアな画像アップロードは「一工程で終わり」ではなく、複数のフェーズで検査を重ねることで実現できます。今後のプロジェクトにもぜひ取り入れてみてください!