install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/file-storage" ~/.claude/skills/majiayu000-claude-skill-registry-file-storage && rm -rf "$T"
manifest:
skills/data/file-storage/SKILL.mdsource content
File & Storage
📋 実行前チェック(必須)
このスキルを使うべきか?
- ファイルアップロードを実装する?
- S3連携を行う?
- ファイル検証処理を実装する?
- 署名付きURLを生成する?
前提条件
- 許可するファイルタイプを定義したか?
- ファイルサイズ上限を決定したか?
- 保存先を決定したか?(ローカル/S3等)
禁止事項の確認
- ユーザー入力のファイル名をそのまま使おうとしていないか?
- 拡張子だけでファイルタイプを判断しようとしていないか?
- サイズ制限なしでアップロードを許可しようとしていないか?
- 機密ファイルをパブリックにしようとしていないか?
トリガー
- ファイルアップロード実装時
- S3連携時
- ファイル検証処理時
- 署名付きURL生成時
🚨 鉄則
ユーザーアップロードは信用しない。検証必須。
アップロード検証
// ⚠️ 必須チェック const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/webp']; const MAX_SIZE = 5 * 1024 * 1024; // 5MB function validateUpload(file: File) { // MIMEタイプ(⚠️ 拡張子だけで判断しない) if (!ALLOWED_TYPES.includes(file.mimetype)) { throw new Error('Invalid file type'); } // サイズ if (file.size > MAX_SIZE) { throw new Error('File too large'); } // ファイル名サニタイズ const safeName = sanitizeFilename(file.originalname); }
S3署名付きURL
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; const url = await getSignedUrl(s3Client, new GetObjectCommand({ Bucket: 'my-bucket', Key: 'file.pdf' }), { expiresIn: 3600 }); // 1時間
🚫 禁止事項まとめ
- ユーザー入力ファイル名のそのまま使用
- 拡張子だけでのファイルタイプ判断
- サイズ制限なしのアップロード
- 機密ファイルのパブリック公開