
SQLインジェクション、XSS、RCE、ボットスキャナー、175以上の攻撃パターンを検出・記録するパッシブなLaravelミドルウェア。内蔵ダッシュボード、Slackアラート、REST API、地理情報エンリッチメントを搭載。WAFではなくIDS。
<p align="center">
<a href="https://packagist.org/packages/jayanta/laravel-threat-detection"><img src="https://img.shields.io/packagist/v/jayanta/laravel-threat-detection.svg?style=flat-square" alt="Latest Version"></a>
<a href="https://github.com/jay123anta/laravel-threat-detection/actions/workflows/tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/jay123anta/laravel-threat-detection/tests.yml?branch=main&style=flat-square&label=tests" alt="Tests"></a>
<a href="https://github.com/jay123anta/laravel-threat-detection/actions/workflows/tests.yml"><img src="https://img.shields.io/badge/PHPStan-level%205-brightgreen?style=flat-square" alt="PHPStan Level 5"></a>
<a href="https://github.com/jay123anta/laravel-threat-detection/actions/workflows/tests.yml"><img src="https://img.shields.io/badge/code%20style-Pint-orange?style=flat-square" alt="Code Style Pint"></a>
<a href="https://packagist.org/packages/jayanta/laravel-threat-detection"><img src="https://img.shields.io/packagist/dt/jayanta/laravel-threat-detection.svg?style=flat-square" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/jayanta/laravel-threat-detection"><img src="https://img.shields.io/packagist/php-v/jayanta/laravel-threat-detection?style=flat-square" alt="PHP Version"></a>
<a href="https://github.com/jay123anta/laravel-threat-detection/blob/main/LICENSE"><img src="https://img.shields.io/packagist/l/jayanta/laravel-threat-detection.svg?style=flat-square" alt="License"></a>
</p>
# Laravel Threat Detection
**Laravel 向けのセキュリティ監視および攻撃ログ記録。SQL インジェクション、
XSS、RCE、ディレクトリトラバーサル、ボットスキャナー、および `/wp-admin` 形式の偵察プローブを検出してログに記録します —
悪意のあるリクエストはすべて、完全なアプリケーションコンテキストとともにデータベースに記録されます。
これは IDS であり、WAF ではありません。リクエストをブロック、フィルタリング、変更することは一切ありません。**
<p align="center">
<img src="https://raw.githubusercontent.com/jay123anta/laravel-threat-detection/main/art/demo.gif" alt="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" width="100%">
</p>
### このような表示を見てここに来ましたか?
```
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/ブロックリストのエクスポート付きで。リクエストがブロックされることは一切ない。錠前ではなく防犯カメラだと考えてほしい。誰が、どれくらいの頻度で、どんな手法であなたのルートを探っているのかを正確に示してくれる。
> 本番アプリから抽出し、実際のトラフィックで実戦検証済み。2,400以上のテスト、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行)— 完全なスニペットは下記の[クイックスタート](#quick-start)にあります。以上で検出が有効になります。
```bash
php artisan threat-detection:doctor # confirms it is actually recording
```
---
## どこに位置づけられるか: IDS vs WAF vs エッジ
このパッケージは**パッシブなアプリケーション層 IDS** です — 監視して記録するだけで、
ブロックはしません。WAF やエッジサービスの*代わり*ではなく、それらと*並んで*配置される
ことを意図しています。各レイヤーは他には見えないものを見ています:
| | **このパッケージ** (アプリ IDS) | **WAF** (ModSecurity + OWASP CRS, Cloudflare WAF) | **エッジ / CDN** (Cloudflare) |
|---|:---:|:---:|:---:|
| 悪意のあるリクエストをブロック | ❌ ログのみ | ✅ | ✅ |
| 完全なアプリコンテキスト (正確な URL、デコード済みペイロード、認証済みユーザー) | ✅ | ⚠️ 部分的 | ❌ |
| 組み込みダッシュボード + あなたの DB 内の脅威ログ | ✅ | ⚠️ さまざま | ⚠️ エッジのみ |
| アプリ固有の検出 (例: Aadhaar / PAN / IFSC PII) | ✅ 組み込み + カスタム | ⚠️ 独自ルールを書く | ⚠️ カスタムルール、プラン依存 |
| オフライン / 外部サービス不要で動作 | ✅ | ⚠️ 依存 | ❌ |
| サーバーに到達する前にトラフィックを止める | ❌ | ⚠️ クラウド WAF のみ | ✅ |
| セットアップ | `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)
によって固定された下限のサンプルです。各行はそのリクエストがログに記録する
*すべて*を列挙しており、
[`ReadmeNoiseFloorTest`](https://github.com/jay123anta/laravel-threat-detection/blob/main/tests/Feature/ReadmeNoiseFloorTest.php)は
いずれかの行がスイートの測定値と一致しなくなるとビルドを失敗させます。
<!-- noise-floor:start -->
| 完全に正当なリクエスト | チューニングされていないインストールがログに記録するもの |
|---|---|
| 検索ボックスに `how to write a UNION SELECT in postgres` と入力 <!-- case: sql tutorial in a search box --> | `SQL Injection UNION` / high |
| `<script>window.dataLayer=[];</script>` を含むブログ記事 <!-- case: javascript snippet in a blog post --> | `XSS Script Tag` / high · `Command Chain Injection` / medium |
| 貼り付けられた `SELECT * FROM users WHERE id = 1` エラーを含むサポートチケット <!-- case: a pasted sql error in a support ticket --> | `SQLi Variant` / high · `SQL SELECT Query` / low |
| `../../etc/passwd` が古典的なトラバーサルペイロードであることを説明するドキュメント <!-- case: a traversal explainer in documentation --> | `Directory Traversal` / medium · `Sensitive File Access` / medium |
| 本物のインドの携帯番号と PAN を収集するプロフィールフォーム <!-- case: a profile form collecting genuine indian pii --> | `PAN Number Detected` / high · `Bank Account Number Detected` / high · `Mobile Number Detected` / low |
<!-- noise-floor:end -->
**これらはどれもバグではありません。** `<script>` を含むブログ記事は、バイト単位で
見れば保存型 XSS ペイロードです。`UNION SELECT` の検索は、その試みと区別が
つきません。10 桁の携帯番号は、もっともらしい銀行口座番号でもあります。
アプリケーションコンテキスト以外にこれらを区別するものはなく、どんなパターン
エンジンもそのコンテキストをあなたに代わって提供することはできません。
それを提供するのは 1 行の設定変更です: そのようなコンテンツを正当に運ぶフィールドを
`safe_fields` で指定する (またはネストされた JSON 内の 1 つのパスなら `safe_paths`)
と、それはもはやスキャンされません。それが上記の行を静めるスイッチです — そして
それは実際のトレードオフです。なぜなら、そのフィールドを通じて届けられる攻撃も
見えなくなるからです。
`content_paths` と `relaxed` モードは別のツールです。これらは低および中重大度の
ノイズを落とし、**高重大度のマッチは意図的に記録し続けます** — そのため設計上、
この表の high の行を静めることはありません。どちらをいつ使うかは
[誤検知の削減](#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、アプリの前にブロック | ✅ | 到達する前にトラフィックを止めたいとき |
正直なまとめ: ハニーポットはフォームスパムを捕まえ、WAF は既知の悪質な
トラフィックをエッジでブロックし、CSP はブラウザを制約します。**それらの
どれも、攻撃者があなたの特定のルートに対して何を試みたかを、ペイロードを
デコードし認証済みユーザーを添えて、教えてはくれません。** このギャップを
埋めるのがこれです — そしてそれが、このパッケージが意図的にブロックしない
理由です: 上記のすべてと並行して、互いに衝突させることなく実行できます。
---
## 要件
- PHP 8.2+ (Laravel 13 は PHP 8.3+ が必要)
- Laravel 10.x、11.x、12.x、または 13.x
- Laravel がサポートする任意のデータベース (MySQL、PostgreSQL、SQLite、SQL Server)
- 任意のキャッシュドライバ - **Redis やキューワーカーは不要**。Redis/Memcached は
オプションの DDoS チェック (非アトミックドライバでは自動的に無効化される) を
有効にするために*推奨*されるだけです。キュー書き込みはオプトインで、デフォルト
ではオフです。
---
## 仕組み
1. ミドルウェアがすべての受信 HTTP リクエストをスキャンします
2. リクエストは SQL インジェクション、XSS、RCE、ファイルトラバーサル、SSRF、LDAP、XPath、SSTI などをカバーする 158 の正規表現パターンに対してチェックされます
3. 脅威パターンがマッチすると、IP、URL、脅威タイプ、重大度レベル、信頼スコアを含むレコードが `threat_logs` データベーステーブルに書き込まれます
4. オプションで、高重大度の脅威に対して Slack アラートが送信されます
5. リクエストは通常どおり続行されます - **何もブロックされません**
検出にインターネット接続は不要です。
---
## クイックスタート
### 1. パッケージをインストールする
```bash
composer require jayanta/laravel-threat-detection
```
### 2. マイグレーションを公開して実行する
> **このステップは必須です。** これを行わないと、パッケージは脅威を検出できてもデータベースに保存できません。このステップをスキップすると、`threat_logs` テーブルが存在せず、すべての検出が通知なく失われます(エラーは `storage/logs/laravel.log` にのみ表示されます)。
```bash
php artisan vendor:publish --tag=threat-detection-migrations
php artisan migrate
```
これにより、`threat_logs`(検出された脅威を保存)と `threat_exclusion_rules`(誤検知ルールを保存)の2つのテーブルが作成されます。
**テーブルが作成されたことを確認:**
```bash
php artisan migrate:status
```
`create_threat_logs_table`、`add_confidence_to_threat_logs_table`、`create_threat_exclusion_rules_table` を探してください - すべて `Ran` と表示されるはずです。
### 3. ミドルウェアを登録する
ミドルウェアはリクエストをスキャンするものです。これを `web` ミドルウェアグループに追加する必要があります。
**Laravel 11 または 12 を使用している場合** - `bootstrap/app.php` を開きます:
```php
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\JayAnta\ThreatDetection\Http\Middleware\ThreatDetectionMiddleware::class,
]);
})
```
> **Laravel のバージョンを確認する方法:** ターミナルで `php artisan --version` を実行します。
**Laravel 10 を使用している場合** - `app/Http/Kernel.php` を開きます:
```php
protected $middlewareGroups = [
'web' => [
// ... existing middleware
\JayAnta\ThreatDetection\Http\Middleware\ThreatDetectionMiddleware::class,
],
];
```
### 4. (オプション) 設定ファイルを公開する
```bash
php artisan vendor:publish --tag=threat-detection-config
```
パッケージは適切なデフォルト設定で動作します。設定を公開すると、検出パターン、感度モード、Slack通知などをカスタマイズできます。この手順を省略しても、すべては引き続き動作します。
**これで完了です。** アプリは脅威を検出するようになりました。
---
## 動作を確認する
インストール後、テスト脅威をトリガーしてログに記録されたことを確認します。
### ステップ1: アプリを起動する
```bash
php artisan serve
```
### ステップ2: ブラウザでテストURLを開く
アプリ内の**既存の任意のルート**(ホームページ、商品ページなど)に悪意のあるクエリパラメータを追加します。例えば:
**SQLインジェクション:**
```
http://localhost:8000/?q=' UNION SELECT * FROM users--
```
**XSS (クロスサイトスクリプティング):**
```
http://localhost:8000/?q=<script>alert(1)</script>
```
**ディレクトリトラバーサル:**
```
http://localhost:8000/?file=../../etc/passwd
```
**RCE (リモートコード実行):**
```
http://localhost:8000/?cmd=system('ls -la')
```
**Shellshock (CVE-2014-6271):**
```
http://localhost:8000/?cmd=() { :;}; /bin/bash
```
**Windows コマンドインジェクション:**
```
http://localhost:8000/?cmd=powershell -c whoami
```
**DROP TABLE (SQL DDL):**
```
http://localhost:8000/?q=DROP TABLE users
```
> アプリに実際に存在するルート(`/` など)を使用してください。URL が 404 を返す場合、ミドルウェアが実行されていない可能性があります。
### ステップ 3: 脅威がログに記録されたことを確認する
**オプション A - Artisan コマンド(最も簡単):**
```bash
php artisan threat-detection:stats
```
`Recorded Detections`、重大度カウント、上位IPを含むテーブルが表示されます。この数値は*行数*をカウントしており、試行回数ではありません。検出はIPごと、脅威タイプごとに5分間に1回書き込まれ、そのウィンドウ内での繰り返しは重複排除され、再度カウントされることはありません。
**オプションB - Tinker:**
```bash
php artisan tinker
```
```php
DB::table('threat_logs')->latest()->take(5)->get(['ip_address', 'type', 'threat_level', 'confidence_score']);
```
**オプション C - Laravel ログファイル:**
検出された各脅威は警告として `storage/logs/laravel.log` に書き込まれます:
```
[high] Threat Detected: [middleware] SQL Injection UNION from 127.0.0.1 (http://localhost:8000/?q=...) [confidence: 50%]
```
### テスト時の注意点
| 動作 | 説明 |
|----------|-------------|
| 同じ脅威は5分間に1回だけログに記録される | 重複排除: 同じIP + 同じ脅威タイプは5分間キャッシュされます。各テストで**異なる攻撃タイプ**を使用するか、テスト間に待機してください。 |
| `curl`リクエストは追加の検出をトリガーする | `curl`を使用すると、「cURL Command」ユーザーエージェント検出(低重要度)もログに記録されます。これは想定された動作です - このパッケージは自動化ツールを検出します。 |
| このパッケージはリクエストをブロックしない | アプリは通常どおり機能し続けます。検出はパッシブです。 |
| Slackの設定は不要 | 通知はデフォルトでオフになっています。 |
| インターネット接続は不要 | コア検出は100%ローカルです。オプションの`threat-detection:enrich`コマンドのみが、ジオデータのために外部APIを呼び出します。 |
### トラブルシューティング
**まずはここから — 1つのコマンドでほとんどの疑問が解決します:**
```bash
php artisan threat-detection:doctor
```
検知が*サイレントに*失敗する原因——ダッシュボードが空のままになり、「攻撃なし」と見分けがつかなくなる——をチェックし、それぞれに対する正確な修正方法を出力します。実際の失敗時には非ゼロで終了するため、CIやデプロイ手順で安全に実行できます。
```
Threat Detection — health check
PASS Detection is enabled for this environment
FAIL 'threat_logs' is missing confidence_label — EVERY threat is being discarded
Run: php artisan vendor:publish --tag=threat-detection-migrations && php artisan migrate
WARN 1 custom pattern(s) shadow a built-in: Localhost SSRF
Your copy runs instead of the maintained one, so later fixes to it never reach you.
```
対象範囲: この環境で検出が有効になっているか、ライターが必要とするすべてのカラム(1つでも欠けると**すべての**脅威が破棄される)、ダッシュボード/APIのカラム、除外ルールテーブル、ミドルウェアが実際にルートまたはグループに接続されているか、このバージョンより前に公開された設定、組み込みパターンを上書きするカスタムパターン、DDoSカウントができないキャッシュドライバー、そして認証なしで公開されたままのダッシュボードまたはAPI。
**「テストしたが `threat-detection:stats` で脅威がゼロと表示される」/「脅威がデータベースに保存されない」**
doctorがパスしたなら、インストールは正常であり、問題はテストリクエスト自体にあります。doctorが確認できない3つの点:
| チェック | 確認方法 |
|-------|---------------|
| IPがホワイトリストに登録されていない | `.env` に `THREAT_DETECTION_WHITELISTED_IPS` を追加した場合、テスト中は削除してください |
| 既存のルートを使用した | テストURLは実際のルート(例: `/`)と一致する必要があります。404はミドルウェアが実行されなかったことを意味します |
| 重複排除キャッシュ | 同じIP + 同じ攻撃タイプは5分間キャッシュされます - 別の攻撃タイプを試してください |
> `php artisan migrate` を単独で実行するだけでは決して十分ではありません: マイグレーションファイルは
> パッケージ内にあり、まずアプリの `database/migrations/` に公開する必要があります。
> これが問題である場合、doctorが正確なコマンドを表示します。
**「APIが401 Unauthorizedを返す」**
以下の[API認証](#api-authentication)を参照してください。
**「ダッシュボードが404を表示する」**
ダッシュボードはデフォルトで無効になっています。`.env` に `THREAT_DETECTION_DASHBOARD=true` を追加し、ルートキャッシュをクリアしてください:
```bash
php artisan route:clear
```
---
## 機能
- **150以上の検出パターン** - SQLインジェクション(UNION、DDL、DML、ファイル操作)、XSS(script、SVG、CSS expression)、RCE、ディレクトリトラバーサル、SSRF、XXE、Log4Shell、NoSQLインジェクション、コマンドインジェクション(Linux + Windows)、LDAPインジェクション、XPathインジェクション、SSTI、CRLFインジェクション、Javaデシリアライゼーションなど
- **83のボット/スキャナーシグネチャ** - SQLMap、Nikto、Nmap、Burp Suite、FeroxBuster、FFUF、XSStrike、Dalfox、Netsparker、その他70以上のスキャナーおよびボットシグネチャ
- **AIスクレイパー検出** - GPTBot、ClaudeBot、ByteSpider、Common Crawl、その他のAIトレーニングボット
- **ヘッドレスブラウザ検出** - HeadlessChrome、PhantomJS、Selenium、Puppeteer、Playwright
- **404プローブ追跡** - 既知の脆弱なパス(`/wp-admin`、`/.env`、`/phpmyadmin`、`/actuator` など)に対する偵察プローブを検出。50以上のデフォルトプローブパスに加え、公開されたLLMゲートウェイ向けのオプトイン [AIインフラストラクチャパック](#ai-infrastructure-probes-opt-in) を提供
- **DDoS監視** - 設定可能なウィンドウによるレートベースの閾値検出
- **信頼度スコアリング** - 各脅威には、パターン数、コンテキスト、シグナルに基づく0〜100の信頼度スコアが付与される
- **回避耐性** - 正規化パイプラインが、パターンマッチングの前にSQLコメント挿入、二重URLエンコーディング、HTMLエンティティエンコーディング、Unicodeエスケープ、16進エスケープ、IIS `%uXXXX` エンコーディングを無効化する — ペイロードが変化しなくなるまで繰り返されるため、2つの手法を重ねても回避できない
- **CVE検出** - Shellshock(CVE-2014-6271)、Spring4Shell(CVE-2022-22965)、PHPUnit RCE(CVE-2017-9841)、Drupalgeddon、Log4Shell
- **コンテキスト対応検出** - クエリ文字列で見つかったパターンは、リクエストボディで見つかったものよりも高いスコアになる
- **リクエストボディスキャン** - フォームエンコードおよびJSON(`application/json`)の両方のリクエストボディが検査される
- **セーフフィールド** - 特定のフォームフィールドをスキャンから除外(CMSエディタ、コード入力、検索フィールド向け)
- **誤検知レポート** - ダッシュボードから脅威を誤検知としてマーク。除外ルールが自動作成される
- **3つの検出モード** - `strict`、`balanced`(デフォルト)、`relaxed` - 調整可能な感度
- **コンテンツパス抑制** - CMS/ブログパスをホワイトリスト化し、リッチコンテンツからの低/中アラートを抑制
- **PII検出** - 機密データ露出パターン(地域ごとに設定可能)
- **地理情報エンリッチメント** - 無料APIによる国、都市、ISP、クラウドプロバイダーの識別
- **Slackアラート** - 高重大度の脅威に対するリアルタイム通知(Laravel 10および11+で動作)
- **組み込みダッシュボード** - ダークモードのBladeダッシュボード(Alpine.jsとTailwind、スタイルはプリコンパイル済み、ビルドステップ不要)
- **ダッシュボード認証ガード** - ダッシュボードとAPIの設定可能な認証(none、auth、role、またはIPベース)
- **15のAPIエンドポイント** - カスタムVue/React/モバイルダッシュボードを構築するための完全なREST API
- **Fail2banエクスポート** - 検出されたIPをfail2ban互換形式またはプレーンなブロックリストでエクスポート
- **ブロックリストエクスポート** - IPをnginx deny、Apache deny、CSV、またはプレーン形式でエクスポート
- **CSVエクスポート** - ワンクリックでの脅威ログエクスポート(最大10,000行)
- **相関分析** - IPをまたいだ協調攻撃や攻撃キャンペーンを検出
- **パフォーマンス最適化** - カテゴリベースの遅延パターン読み込み(関連する攻撃カテゴリの正規表現のみを実行)、クリーンなリクエストの早期ベイルアウト、ブラウザUAショートサーキット(通常のブラウザでは70以上のチェックをスキップ)、プローブパスのハッシュルックアップ、バッチDB挿入、リクエストごとの最大検出数の設定
- **データベース非依存** - MySQL、PostgreSQL、SQLite、SQL Server
- **ゼロコンフィグ** - 適切なデフォルト設定でそのまま動作
- **設計による安全性** - ミドルウェアは自身のエラーをキャッチする。検出が失敗しても、アプリは動作し続ける。リクエストがブロックされることはない。
---
## 設定
このパッケージは `.env` の変更なしで動作する。以下の値はすべてオプションであり、デフォルトを上書きしたい場合にのみ追加する。
```env
# Enable/disable detection globally (default: true)
THREAT_DETECTION_ENABLED=true
# Detection sensitivity (default: balanced)
# Options: strict, balanced, relaxed
```
---
[Read more](https://github.com/jay123anta/laravel-threat-detection)