コンテンツにスキップ

Pompelmi コマンド

Node.js アプリケーション保護向けの包括的な Pompelmi ファイルアップロードセキュリティスキャンコマンド。

コマンド説明
npm install pompelminpmを経由してPompelmiをインストール
yarn add pompelmiYarnを経由してPompelmiをインストール
pnpm add pompelmipnpmを経由してPompelmiをインストール
bun add pompelmiBunを経由して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/expressExpress.jsミドルウェアアダプター
pompelmi/koaKoaミドルウェアアダプター
pompelmi/nextNext.js APIルートアダプター
pompelmi/nitroNuxt/Nitroアダプター
pompelmi/fastifyFastifyプラグインアダプター
オプション説明
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.safeboolean: ファイルがすべてのチェックに合格
result.threats検出された脅威の配列
result.mimeType検出されたMIMEタイプ
result.extensionファイル拡張子
result.sizeファイルサイズ(バイト)
result.hashファイルのSHA-256ハッシュ
result.scanTimeスキャンにかかった時間(ms)
result.yaraMatchesYARAルールマッチ(有効な場合)
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ルールを定期的に更新脅威インテリジェンスを現在の状態に保つ
ホワイトリストをブラックリストより優先ホワイトリストはブラックリストより安全