Node.js アプリケーション保護向けの包括的な Pompelmi ファイルアップロードセキュリティスキャンコマンド。
| コマンド | 説明 |
|---|
npm install pompelmi | npmを経由してPompelmiをインストール |
yarn add pompelmi | Yarnを経由してPompelmiをインストール |
pnpm add pompelmi | pnpmを経由してPompelmiをインストール |
bun add pompelmi | Bunを経由してPompelmiをインストール |
const express = require('express');
const { createScanner } = require('pompelmi');
const app = express();
const scanner = createScanner({
maxFileSize: '10mb',
allowedExtensions: ['.pdf', '.png', '.jpg', '.docx'],
});
app.post('/upload', scanner.middleware(), (req, res) => {
res.json({ files: req.files });
});
| フレームワーク | 説明 |
|---|
pompelmi/express | Express.jsミドルウェアアダプター |
pompelmi/koa | Koaミドルウェアアダプター |
pompelmi/next | Next.js APIルートアダプター |
pompelmi/nitro | Nuxt/Nitroアダプター |
pompelmi/fastify | Fastifyプラグインアダプター |
| オプション | 説明 |
|---|
maxFileSize: '10mb' | 許可される最大ファイルサイズ |
allowedExtensions: ['.pdf', '.png'] | 許可されるファイル拡張子のホワイトリスト |
blockedExtensions: ['.exe', '.bat'] | ブロックされるファイル拡張子のブラックリスト |
allowedMimeTypes: ['image/png'] | 許可されるMIMEタイプのホワイトリスト |
scanTimeout: 30000 | スキャンタイムアウト(ミリ秒) |
tempDir: '/tmp/pompelmi' | スキャン用の一時ディレクトリ |
preserveOriginalName: true | 元のファイル名を保持 |
| オプション | 説明 |
|---|
yara: { enabled: true } | YARAルールスキャンを有効化 |
yara: { rules: './rules/' } | カスタムYARAルールディレクトリへのパス |
yara: { builtinRules: true } | ビルトインマルウェア検出ルールを使用 |
yara: { timeout: 10000 } | YARAスキャンタイムアウト |
| カスタムYARAルールファイル | カスタム検出用に .yar ファイルを作成 |
| オプション | 説明 |
|---|
archive: { enabled: true } | アーカイブ検査を有効化 |
archive: { maxDepth: 3 } | ネストされたアーカイブの最大再帰深度 |
archive: { maxFiles: 100 } | アーカイブ内の最大ファイル数 |
archive: { maxRatio: 100 } | 最大圧縮率(zipボム対策) |
archive: { maxSize: '100mb' } | 最大抽出合計サイズ |
archive: { formats: ['zip', 'tar', 'gz'] } | サポートされているアーカイブ形式 |
| ポリシー | 説明 |
|---|
policy: 'strict' | 疑わしいものはすべてブロック(推奨) |
policy: 'moderate' | 既知マルウェアをブロック、疑わしいものは警告 |
policy: 'permissive' | 確認済みマルウェアのみをブロック |
| カスタムポリシー関数 | 独自の受け入れ/却下ロジックを定義 |
| チェック | 説明 |
|---|
| 拡張子検証 | ホワイトリストに対してファイル拡張子をチェック |
| マジックバイト検出 | コンテンツバイトでファイルタイプを検証 |
| MIMEタイプ検証 | サーバー側のMIMEタイプチェック |
| 二重拡張子検出 | file.pdf.exe トリックをキャッチ |
| ヌルバイト検出 | ファイル名のヌルバイトインジェクションをブロック |
| Content-Typeミスマッチ | 拡張子/コンテンツのミスマッチを検出 |
| イベント | 説明 |
|---|
scanner.on('scan:start', fn) | スキャン開始時に発火 |
scanner.on('scan:complete', fn) | スキャン完了時に発火 |
scanner.on('scan:reject', fn) | ファイルが却下されたときに発火 |
scanner.on('scan:accept', fn) | ファイルがすべてのチェックに合格したときに発火 |
scanner.on('scan:error', fn) | スキャンエラー時に発火 |
scanner.on('yara:match', fn) | YARAルールがマッチしたときに発火 |
| プロパティ | 説明 |
|---|
result.safe | boolean: ファイルがすべてのチェックに合格 |
result.threats | 検出された脅威の配列 |
result.mimeType | 検出されたMIMEタイプ |
result.extension | ファイル拡張子 |
result.size | ファイルサイズ(バイト) |
result.hash | ファイルのSHA-256ハッシュ |
result.scanTime | スキャンにかかった時間(ms) |
result.yaraMatches | YARAルールマッチ(有効な場合) |
const { createScanner } = require('pompelmi');
const scanner = createScanner({
maxFileSize: '5mb',
allowedExtensions: ['.pdf', '.png', '.jpg'],
yara: { enabled: true, builtinRules: true },
archive: { enabled: true, maxDepth: 2 },
policy: 'strict',
});
// ミドルウェアとして使用
app.post('/upload', scanner.middleware(), handleUpload);
// 手動スキャン
app.post('/upload', async (req, res) => {
const result = await scanner.scan(req.file.buffer, {
filename: req.file.originalname,
});
if (!result.safe) {
return res.status(400).json({
error: 'File rejected',
threats: result.threats,
});
}
// セーフなファイルを処理...
});
const { createScanner } = require('pompelmi/koa');
const scanner = createScanner({
maxFileSize: '10mb',
allowedMimeTypes: ['application/pdf', 'image/*'],
});
router.post('/upload', scanner.middleware(), async (ctx) => {
ctx.body = { files: ctx.request.files };
});
import { createScanner } from 'pompelmi/next';
const scanner = createScanner({
maxFileSize: '5mb',
allowedExtensions: ['.pdf', '.png'],
});
export default scanner.handler(async (req, res) => {
const files = req.files;
res.json({ uploaded: files.length });
});
| コマンド | 説明 |
|---|
npx pompelmi scan <file> | 単一ファイルをスキャン |
npx pompelmi scan ./uploads/ | ファイルのディレクトリをスキャン |
npx pompelmi scan --yara <file> | YARAルールでスキャン |
npx pompelmi scan --json <file> | 結果をJSON形式で出力 |
npx pompelmi rules list | 利用可能なYARAルールを一覧表示 |
npx pompelmi rules update | ビルトインYARAルールを更新 |
| ヒント | 説明 |
|---|
| 本番環境ではstrictポリシーを使用 | 疑わしいものはすべてブロック |
| YARAルールを有効化 | 既知マルウェアシグネチャを検出 |
| アーカイブ制限を設定 | zipボムとネストされたペイロードを防止 |
| サーバー側でMIMEタイプを検証 | クライアントContent-Typeを信頼しない |
| 二重拡張子をチェック | file.pdf.exe パターンをブロック |
| 合理的なサイズ制限を設定 | リソース枯渇を防止 |
| メモリ内でスキャン | 信頼できないファイルをディスクに書き込まない |
| スキャンイベントを監視 | 拒否についてログと通知を行う |
| YARAルールを定期的に更新 | 脅威インテリジェンスを現在の状態に保つ |
| ホワイトリストをブラックリストより優先 | ホワイトリストはブラックリストより安全 |