> For the complete documentation index, see [llms.txt](https://help.aikido.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.aikido.dev/docs/docs-ja/zen-firewall/zen-features/idor-protection-with-zen-firewall.md).

# Zen Firewall による IDOR 保護

IDORは Insecure Direct Object Reference の略です。これはアクセス制御の不備の一種で、データベースクエリのスコープ設定が適切でないために、あるアカウントが別のアカウントのデータにアクセスできてしまう問題です。

マルチテナントの SaaS アプリケーションでは、データは通常 tenant\_id、account\_id、organization\_id などの列で分離されます。クエリがその列での絞り込みを忘れたり、誤った値を使ったりすると、アカウント間でデータが漏れる可能性があります。

Zen Firewall の IDOR Protection は、実行時に SQL クエリを解析し、テナントのスコープを自動的に強制します。クエリが安全でない場合、Zen は即座にエラーを出します。

これにより、本番障害の後ではなく、開発やテストの段階でマルチテナント分離の不具合を見つけられます。

脆弱性そのものについての詳しい説明は、次のブログ記事をご覧ください: [IDOR 脆弱性の解説](https://www.aikido.dev/blog/idor-vulnerability-explained)

## サポートされているデータベース

{% tabs %}
{% tab title="Node.js" %}
現在サポートされているドライバ:

* mysql および mysql2 経由の MySQL
* pg 経由の PostgreSQL
* SQLite（better-sqlite3 および node:sqlite パッケージ経由）

内部でこれらのドライバを使用する ORM やクエリビルダーはサポートされています。たとえば Drizzle、Knex、Sequelize、TypeORM です。

Prisma のように独自のクエリエンジンを使う ORM は、サポートされているドライバアダプタを使うように設定しない限りサポートされません。

{% hint style="info" %}
ESM を使う場合は、 [ESM の注意点](https://github.com/AikidoSec/firewall-node/blob/main/docs/esm.md)を確認してください。インストルメントされていない ESM のサブ依存関係内のクエリは Zen ではチェックできません。
{% endhint %}
{% endtab %}
{% endtabs %}

## 制限事項

* [Node.js](https://github.com/AikidoSec/firewall-node/blob/main/docs/idor-protection.md#limitations)

## Zenが防ぐもの

有効にすると、Zen は次のことをすべての関連クエリについて検証します:

* SELECT、UPDATE、DELETE で正しいテナント列を基準に絞り込まれていること
* 正しいテナント ID の値を使っていること
* すべての INSERT にテナント列が含まれていること
* INSERT でテナント列が正しいテナント ID に設定されていること<br>

Zen がブロックする問題の例:

* テナントフィルタのない SELECT により、あるアカウントが別のアカウントのデータを読めてしまう
* テナントのスコープがない UPDATE または DELETE
* テナント列を省略した INSERT
* 誤ったテナント ID を設定する INSERT

{% hint style="warning" %}
IDOR 保護は、block モードでも detect モードでも、違反時には常に Error を投げます。テナントフィルタの欠如は外部攻撃ではなく、開発者側のバグです。
{% endhint %}

## 仕組み

Zen はサポートされているデータベースドライバをインストルメントし、実行時に SQL クエリを検査します。各リクエストごとに、アクティブなテナント ID を設定します。その後 Zen は、すべての関連クエリが次を満たしていることを検証します:

1. 設定されたテナント列を参照していること。
2. リクエストに対して設定されたものと同じテナント ID を使っていること。

クエリがこれらの条件を満たさない場合、Zen はエラーを投げて実行を防ぎます。

## セットアップ

{% stepper %}
{% step %}
**起動時に IDOR 保護を有効にする**

アプリケーションの起動時に IDOR 保護を有効にします

{% tabs %}
{% tab title="Node.js" %}

```js
import Zen from "@aikidosec/firewall";

Zen.enableIdorProtection({
  tenantColumnName: "tenant_id",
  excludedTables: ["users"],
});
```

設定オプション:

* `tenantColumnName`

  テーブル内でテナントを識別する列。たとえば tenant\_id、account\_id、organization\_id などです。
* `excludedTables`

  単一テナントにスコープされていないため、チェック対象外にするテーブルです。たとえば、すべてのテナントのユーザーを含む共有 users テーブルなどです。
  {% endtab %}
  {% endtabs %}
  {% endstep %}

{% step %}
**リクエストごとにテナント ID を設定する**

IDOR 保護が有効な場合、すべてのリクエストにテナント ID が必要です。

通常は認証後のミドルウェアで、リクエスト処理の早い段階で setTenantId を呼び出してください。

{% tabs %}
{% tab title="Node.js" %}

```js
import Zen from "@aikidosec/firewall";

app.use((req, res, next) => {
  // 認証レイヤーからテナント ID を取得する
  Zen.setTenantId(req.user.organizationId);

  next();
});
```

{% hint style="warning" %}
リクエストで setTenantId が呼ばれていない場合、SQL クエリの実行時に Zen は Error を投げます。
{% endhint %}
{% endtab %}
{% endtabs %}
{% endstep %}

{% step %}
**特定のクエリで IDOR チェックをバイパスする**

クロステナント分析や内部管理レポートなど、意図的にグローバルなクエリもあります。

特定のコードブロックで IDOR チェックをスキップするには、withoutIdorProtection を使います:

```js
import Zen from "@aikidosec/firewall";

const result = await Zen.withoutIdorProtection(async () => {
  return await db.query(
    "SELECT count(*) FROM agents WHERE status = 'running'"
  );
});
```

コールバック内で実行されたクエリのみが IDOR 検証の対象外になります。

これは慎重に使い、クロステナントアクセスが明示的に必要な箇所にのみ使用してください。
{% endstep %}
{% endstepper %}

## トラブルシューティング

### テナントフィルタがありません

```
Zen IDOR 保護: テーブル 'orders' のクエリに列 'tenant_id' のフィルタがありません
```

このクエリは、設定されたテナント列で絞り込んでいません。これは SELECT、UPDATE、DELETE に適用されます。

例:

```
SELECT * FROM orders WHERE status = 'active';
```

tenant\_id で絞り込む条件を追加してください。

### テナント ID の値が間違っています

```
Zen IDOR 保護: テーブル 'orders' のクエリは 'tenant_id' を値 '456' で絞り込んでいますが、テナント ID は '123' です
```

このクエリはテナント列で絞り込んでいますが、その値が `setTenantId`.<br>

で設定されたテナント ID と一致していません。

### INSERT にテナント列がありません

```
Zen IDOR 保護: テーブル 'orders' への INSERT に列 'tenant_id' がありません
```

すべての INSERT にはテナント列を含める必要があります。

#### INSERT のテナント ID が間違っています

```
Zen IDOR 保護: テーブル 'orders' への INSERT は 'tenant_id' を '456' に設定していますが、テナント ID は '123' です
```

この INSERT にはテナント列が含まれていますが、その値がアクティブなテナント ID と一致していません。

### \`setTenantId\` の呼び出しがありません

```
Zen IDOR 保護: このリクエストでは setTenantId() が呼ばれていません。IDOR 保護が有効な場合、すべてのリクエストにテナント ID が必要です。
```

データベースクエリが実行される前に、すべてのリクエストで setTenantId が呼ばれるようにしてください。

## 常に許可される文

Zen がチェックするのは、行データを読み取る、または変更する文だけです:

* SELECT
* INSERT
* UPDATE
* DELETE

次のものは認識され、IDOR エラーを引き起こすことはありません:

* CREATE TABLE、ALTER TABLE、DROP TABLE などの DDL 文
* SET、SHOW などのセッションコマンド
* BEGIN、COMMIT、ROLLBACK などのトランザクション文


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://help.aikido.dev/docs/docs-ja/zen-firewall/zen-features/idor-protection-with-zen-firewall.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
