アップデート一覧に戻る
New releaseJul 23, 2026

laravel-threat-detection v1.3.1

Laravel向け受動的脅威検出ミドルウェア。SQLインジェクション、XSS、RCE、ボットスキャナー、404プローブ、および175以上の攻撃パターンを記録します。組み込みダッシュボード、fail2banエクスポート、Slackアラート、REST APIを備えています。IDSであり、WAFではありません。

共有

Latest Version Tests PHPStan Level 5 Code Style Pint Total Downloads PHP Version License

Laravel Threat Detection

Laravel 向けのセキュリティ監視および攻撃ログ記録。SQL インジェクション、 XSS、RCE、ディレクトリトラバーサル、ボットスキャナー、および /wp-admin 形式の偵察プローブを検出してログに記録します — すべての悪意あるリクエストは、完全なアプリケーションコンテキストとともにデータベースに記録されます。 これは IDS であり、WAF ではありません。リクエストをブロック、フィルタリング、変更することは一切ありません。

Install the package, send three attacks — SQL injection, directory traversal, XSS — every one returns HTTP 200 because nothing is blocked, and all three are already counted in threat-detection:stats

このようなものを見かけたのでここに来ましたか?```

GET /wp-admin/setup-config.php 404 — on a site that isn't WordPress GET /.env 404 — someone wants your database password GET /?id=1' UNION SELECT password FROM 200 — SQL injection against a real route GET /phpmyadmin/index.php 404 — scanning for an admin panel

そうしたリクエストはすでにあなたのLaravelアプリに届いている。アクセスログにはURLとステータスコードしか残っておらず、デコードされたペイロードも、どのルートが狙われたのかも、同じIPがこの1時間に他に40回も試行したかどうかも分からない。

このパッケージはそうした疑問に答える。Laravel 10〜13の任意のアプリに導入すれば、すべてのHTTPリクエストを150以上の攻撃パターンと照合してスキャンし、各マッチを信頼度でスコアリングしてデータベースに書き込む。さらに組み込みダッシュボード、Slackアラート、地理情報の付加、fail2ban/ブロックリストのエクスポートも備えている。リクエストがブロックされることは一切ない。錠前ではなく防犯カメラだと考えてほしい。誰が、どれくらいの頻度で、どんな手法であなたのルートを探っているのかを正確に示してくれる。

> 本番アプリから抽出し、実際のトラフィックで実戦検証済み。テストは1,857件、Laravel本体以外の実行時依存はなく、検出にインターネット接続も不要。
>
> アップグレードする場合は [UPGRADING.md](https://github.com/jay123anta/laravel-threat-detection/blob/main/UPGRADING.md) を参照。コントリビュートする場合は [CONTRIBUTING.md](https://github.com/jay123anta/laravel-threat-detection/blob/main/CONTRIBUTING.md) を参照。

## 1分以内に始める```bash
composer require jayanta/laravel-threat-detection
php artisan vendor:publish --tag=threat-detection-migrations
php artisan migrate

次に、ミドルウェアを web グループに追加します(Laravel 11+ では bootstrap/app.php に1行、Laravel 10 では app/Http/Kernel.php に1行)— 完全なスニペットは以下のクイックスタートにあります。これで検出が有効になります。```bash php artisan threat-detection:doctor # confirms it is actually recording

---

## どこに位置づけられるか: IDS vs WAF vs エッジ

このパッケージは**パッシブなアプリケーション層 IDS** です — 監視と記録を行い、ブロックは
しません。WAF やエッジサービスの*代わり*ではなく、それらと*並んで*配置されることを意図しています。各レイヤーは他のレイヤーには見えないものを見ています:

| | **このパッケージ** (アプリ IDS) | **WAF** (mod_security, Cloudflare WAF) | **エッジ / CDN** (Cloudflare) |
|---|:---:|:---:|:---:|
| 悪意のあるリクエストをブロック | ❌ ログのみ | ✅ | ✅ |
| 完全なアプリコンテキスト (正確なルート、デコード済みペイロード、認証済みユーザー) | ✅ | ⚠️ 部分的 | ❌ |
| 組み込みダッシュボード + あなたの DB 内の脅威ログ | ✅ | ⚠️ さまざま | ⚠️ エッジのみ |
| アプリ固有の検出 (例: Aadhaar / PAN / IFSC PII) | ✅ カスタムパターン | ❌ | ❌ |
| オフライン動作 / 外部サービス不要 | ✅ | ⚠️ 依存する | ❌ |
| アプリに到達する前にトラフィックを停止 | ❌ | ✅ エッジ | ✅ |
| セットアップ | `composer require` 1 回 | 中〜高 | 低〜中 |
| コスト | 無料、MIT | さまざま | 無料枠 + 有料 |

**要約すると:** エッジ/WAF はドアの鍵であり、これは*内側*の防犯カメラです。どのルートで、誰が、どれくらいの頻度で何を試みているかを正確に伝えるアプリコンテキストを備えています。これを使って実際の意思決定 — fail2ban の BAN、レート制限、ジオブロッキング — を、エッジレイヤーには決して見えないデータで行いましょう。

### 意図的にそうしていないこと

- **WAF ではありません。** リクエストをブロック、フィルタリング、変更することは一切ありません。強制には Cloudflare、mod_security、または本物の WAF を使用してください。(引き渡すエッジレイヤーがない場合は、[オペレーター側ヘルパー](#acting-on-the-data-operator-side-blocking)がパッケージの判断を公開するので、独自の 5 行のブロッキングミドルウェアを書けます — 強制コードはパッケージのものではなく、あなたのものです。)
- **セキュアコーディングの代替ではありません。** パラメータ化クエリ、入力検証、出力エスケープが実際の防御です。このパッケージはあなたのコードがすでに安全であることを前提とし、*可視性*を与えるものであり、保護ではありません。
- **エッジサービスではありません。** Cloudflare を前に置けるならそうしてください — そしてエッジサービスには見えないアプリケーション層の詳細のためにこれを追加してください。
- **完全な検出器ではなく、そうなることもできません。** パターンマッチングは*既知の攻撃に見える*攻撃を捕捉します。新しい手法、または十分に書き換えられた見慣れた手法は、ログに残らず通過します — そして通過したことを知らされることもありません。ここでの沈黙は「何もマッチしなかった」を意味し、「何も起こらなかった」を決して意味しません。その価値が発揮されるのは、公開 Laravel アプリに実際に到達するものの大半を占める、大量で低労力のトラフィックです: スキャナー、偵察プローブ、既製のインジェクション文字列、クレデンシャルスタッフィング。静かなログは証拠の不在として扱い、不在の証拠として扱わないでください。

### 初日から自分のコンテンツを検知すると想定してください

チューニングされていないインストールは正当なコンテンツに対して発火します。これはインストール後にではなく、インストール前に知っておくべきことです。これらは仮定ではなく実測です — スイートはこの正確なリストを固定してドリフトしないようにしています ([`LegitimateTrafficCorpusTest`](https://github.com/jay123anta/laravel-threat-detection/blob/main/tests/Feature/LegitimateTrafficCorpusTest.php)):

<!-- noise-floor:start -->
| 完全に正当なリクエスト | チューニングされていないインストールが記録するもの |
|---|---|
| 検索ボックスに `how to write a UNION SELECT in postgres` と入力 | `SQL Injection UNION` / high |
| `<script>window.dataLayer=[];</script>` を含むブログ記事 | `XSS Script Tag` / high |
| 貼り付けられた `SELECT * FROM users WHERE id = 1` エラーを含むサポートチケット | `SQLi Variant` / high |
| `../../etc/passwd` が古典的なトラバーサルペイロードであることを説明するドキュメント | `Directory Traversal` / medium |
| 本物のインドの携帯番号と PAN を収集するプロフィールフォーム | `PAN Number Detected` / high |
<!-- noise-floor:end -->

**これらはどれもバグではありません。** `<script>` を含むブログ記事は、バイト単位で見れば
保存型 XSS ペイロードです。`UNION SELECT` の検索は、その試みと区別がつきません。アプリケーションコンテキスト以外に両者を分けるものはなく、パターンエンジンがそのコンテキストをあなたに代わって提供することはできません。

それを提供するのは 1 行の設定変更です — `safe_fields`、`safe_paths`、
`content_paths`、または `relaxed` モード。[誤検知の削減](#reducing-false-positives)を参照してください。
**あなたのアプリがリッチテキスト、コードサンプル、または検索クエリを受け入れるなら、出力を判断する前にそうしてください。** デフォルトは静かで不完全であるよりも、意図的にノイズが多く正直です: 既知のマッチを黙らせる方が、発火しなかったものを見つけるよりも簡単です。

### では実際にどう使うのか?

決してブロックしない検出器についての最もよくある質問です。労力の少ない順に 4 つの答えがあります:

| やりたいこと | 使うもの | 労力 |
|---|---|---|
| 何が自分を攻撃しているか見る | [ダッシュボード](#dashboard) または `threat-detection:stats` | なし、すでに動作中 |
| 常習犯をファイアウォールで BAN | [`threat-detection:export-fail2ban`](#artisan-commands) — cron にパイプ | 1 行 |
| Web サーバーで拒否 | [`threat-detection:export-blocklist`](#artisan-commands) → nginx/apache ディレクティブ | 1 行 |
| アプリ内でリクエストを拒否 | [オペレーター側ヘルパー](#acting-on-the-data-operator-side-blocking) — `isBlocklisted()`、`isDdosThresholdExceeded()` | 自分のミドルウェア約 10 行 |
| リアルタイムで反応 | [`ThreatDetected` イベント](#threatdetected-event) — Telegram、SIEM、PagerDuty | リスナー 1 つ |

パッケージはインテリジェンスを提供し、拒否はあなたが提供します。この分離は
意図的です — あなたのアプリに存在する強制コードは、あなたが読めて、テストでき、オフにできるコードであり、検出のバグがあなたのサイトをダウンさせることが決してないことを意味します。


### 他の Laravel セキュリティパッケージとの比較

これらは異なる問題を解決し、うまく組み合わせられます — この表は勝ち負けではなく、適切なツールを選ぶことについてです。

| パッケージ | 何をするか | ブロック? | 使うべきとき |
|---|---|:---:|---|
| **このパッケージ** | すべてのリクエストを 150 以上のパターンに対してスキャンし、完全なアプリコンテキストでログ | ❌ | あなたのアプリで何が試みられているかを*見たい*とき |
| `spatie/laravel-honeypot` | スパムボットを捕まえる隠しフォームフィールド | ✅ フォームのみ | 公開フォームがスパムを受けているとき |
| `graham-campbell/security` | 入力から XSS っぽいマークアップを除去 | ✅ 変更する | 素朴な入力サニタイズが欲しいとき |
| `spatie/laravel-csp` | Content-Security-Policy ヘッダーを送信 | ✅ ブラウザ | ブラウザが読み込むものを制限したいとき |
| `laravel/fortify` + レート制限 | 認証スロットリングとロックアウト | ✅ | ログインにブルートフォース対策が必要なとき |
| Cloudflare / mod_security | エッジ WAF、アプリの前にブロック | ✅ | トラフィックが到着する前に停止したいとき |

カテゴリ