コンテンツへスキップ
Tutorial

1 回の API 呼び出しで PII を保存する前に、ユーザー入力をスキャンします。

| 6 min read

テキスト内の電子メール、電話番号、SSN、クレジット カード、IP アドレスを、データベースにヒットする前に検出して編集します。 アカウント不要の無料の PII 検出 API。

Privacy shield with personal data icons
Photo by Jason Dent on Unsplash

顧客はサポート チケットを送信し、説明にクレジット カード番号を貼り付けます。 ユーザーはフィードバック フォームに記入し、社会保障番号を含めます。 内部ツールが完全なリクエスト本文をログに記録し、ログ アグリゲーターが電子メール アドレスを保存するようになりました。 そして尋ねたこともない電話番号。

これは、企業が必要のない PII を収集する最も一般的な方法です。 機能リクエストではありません 間違ってしまいました。 フリーテキスト入力と同じことを行うフリーテキスト入力です。 また、GDPR 第 5 条(1)(c) に基づき、 必要のない個人データを保存することは、データ最小化の原則に違反します。

修正方法は、PII がデータベースに到達する「前」にテキストをスキャンすることです。 1 つの API 呼び出しでメールをキャッチし、 電話番号、SSN、クレジット カード番号、IP アドレス、生年月日。

PII を検出するための 1 つの API 呼び出し

テキストを次の宛先に送信します。 /v1/pii/detect 終点。 API はそれをスキャンし、すべての値を返します。 PII は、そのタイプ、位置、およびマスクされたバージョンと一致します。

curl -X POST https://api.botoi.com/v1/pii/detect \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "My name is John Smith, call me at 555-123-4567 or email john@example.com"
  }'

応答:

{
  "success": true,
  "data": {
    "found": true,
    "count": 3,
    "findings": [
      {
        "type": "email",
        "value": "john@example.com",
        "start": 56,
        "end": 72,
        "masked": "j***@e******.com"
      },
      {
        "type": "phone",
        "value": "555-123-4567",
        "start": 37,
        "end": 49,
        "masked": "***-***-4567"
      }
    ]
  }
}

API は、入力内で電子メール アドレスと電話番号という 2 つの PII 項目を検出しました。 それぞれの調査結果には以下が含まれます 文字の位置 (start そして end) 置換、編集、 または、正確な部分文字列にフラグを立てます。

サポートされている PII タイプ

Type            Example match              Masked output
─────────────   ─────────────────────────  ─────────────────────
email           john@example.com           j***@e******.com
phone           555-123-4567               ***-***-4567
ssn             123-45-6789                ***-**-6789
credit_card     4111111111111111           ************1111
ip_address      192.168.1.42               ***.***.***.42
date_of_birth   1990-05-15                 ****-**-15

すべての型は、 masked を識別するのに十分なコンテキストを保持するバージョン 完全な値を公開せずにデータ カテゴリを削除します。

事前保存スキャナーを構築する

最も価値の高い統合ポイントは、ユーザー入力をデータベースに書き込む直前です。 この Node.js の例では、サポート チケット フィールドをスキャンし、PII を含む送信を拒否します。

import express from "express";

const app = express();
app.use(express.json());

async function detectPII(text) {
  const res = await fetch("https://api.botoi.com/v1/pii/detect", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ text }),
  });
  return res.json();
}

app.post("/support-tickets", async (req, res) => {
  const { subject, body } = req.body;

  // Scan both fields before saving
  const subjectScan = await detectPII(subject);
  const bodyScan = await detectPII(body);

  if (subjectScan.data.found || bodyScan.data.found) {
    const allFindings = [
      ...(subjectScan.data.findings || []),
      ...(bodyScan.data.findings || []),
    ];

    return res.status(422).json({
      error: "PII detected in submission",
      findings: allFindings.map((f) => ({
        type: f.type,
        masked: f.masked,
      })),
    });
  }

  // Safe to store; no PII found
  await saveTicket({ subject, body });
  res.status(201).json({ created: true });
});

ユーザーが PII を含むチケットを送信すると、見つかった内容をリストした 422 応答が返されます。 (生データではなく、マスクされた値を使用します)。 機密情報を削除して再送信できます。 データベースが PII を認識することはありません。

このアプローチは、お問い合わせフォーム、フィードバック調査、コメント システム、社内メモなど、あらゆるフォームで機能します。 ユーザーがフリーテキストを入力するとどこにでも PII が表示される可能性があります。

ログに記録する前に編集する

PII の拒否は、ユーザー向けフォームで機能します。 ただし、ログ、エラー メッセージ、監査証跡については、 センシティブな部分を削除しながらテキストを保持したい場合。 この関数はそれぞれを置き換えます PII はマスクされたバージョンと一致します。

async function redactPII(text) {
  const res = await fetch("https://api.botoi.com/v1/pii/detect", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ text }),
  });
  const { data } = await res.json();

  if (!data.found) return text;

  // Replace each finding with its masked version
  let redacted = text;
  // Process findings from end to start so positions stay valid
  const sorted = [...data.findings].sort((a, b) => b.start - a.start);
  for (const finding of sorted) {
    redacted =
      redacted.slice(0, finding.start) +
      finding.masked +
      redacted.slice(finding.end);
  }

  return redacted;
}

// Usage
const logMessage = "User john@example.com reported issue from 192.168.1.42";
const safe = await redactPII(logMessage);
console.log(safe);
// "User j***@e******.com reported issue from ***.***.***.42"

この関数は、結果を文字列の末尾から逆方向に処理します。 これにより性格が保たれます 置換中に文字列の長さが変化しても、位置は有効になります。 結果はログセーフです 意味は保持されますが、個人データはマスクされる文字列。

これをログ パイプライン、エラー報告ミドルウェア、またはデータをキャプチャするシステムにドロップします。 ユーザーが作成したテキスト。

GDPR 準拠: フリーテキスト フィールドを自動的にスキャン

GDPR のデータ最小化原則 (第 5 条(1)(c)) では、個人情報のみを収集することが求められています。 特定の目的に必要なデータ。 自由記述フィールドは、ほとんどのコンプライアンスにおける最大のギャップです ユーザーが何を入力するかを予測できないためです。

この Express ミドルウェアは、複数のルートにわたって構成可能なフィールドをスキャンします。

async function gdprScanMiddleware(req, res, next) {
  const fieldsToScan = ["message", "notes", "description", "comment"];
  const findings = [];

  for (const field of fieldsToScan) {
    if (req.body[field]) {
      const scan = await detectPII(req.body[field]);
      if (scan.data.found) {
        findings.push(
          ...scan.data.findings.map((f) => ({
            field,
            type: f.type,
            masked: f.masked,
          }))
        );
      }
    }
  }

  if (findings.length > 0) {
    return res.status(422).json({
      error: "Personal data detected. Remove PII before submitting.",
      findings,
    });
  }

  next();
}

// Apply to routes that accept free-text input
app.post("/feedback", gdprScanMiddleware, feedbackHandler);
app.post("/comments", gdprScanMiddleware, commentHandler);
app.post("/contact", gdprScanMiddleware, contactHandler);

フリーテキスト入力を受け入れるルートにミドルウェアを接続します。 指定したフィールドをスキャンします。 PII が見つかった場合、データが保存される前に、明確なエラー メッセージが表示されてリクエストは拒否されます。

これにより、GDPR レビュー中に指摘できる監査可能なコントロールが提供されます。「自由テキスト入力は、 API レイヤーで PII をスキャンします。 個人データを含む提出物は保存される前に拒否されます。」

スタック内の PII スキャンを追加する場所

  • APIミドルウェア。 リクエスト本文がビジネス ロジックに到達する前にスキャンします。 システムのエントリ ポイントで PII を捕捉します。
  • フォームの検証。 フォームを送信する前に、クライアント側またはサーバー側で API を呼び出します。 ユーザーが自分で PII を削除できるようにします。
  • ログパイプライン。 ログ メッセージがログ アグリゲーターに到達する前に、ログ メッセージ内の PII を編集します。 機密データがインフラストラクチャ全体に拡散するのを防ぎます。
  • データのエクスポート。 CSV または JSON エクスポートをサードパーティに送信する前にスキャンします。 データがシステムから流出する前に、もう 1 つのチェックポイントが必要です。
  • チャットとメッセージング。 社内ツールまたは顧客対応チャットでメッセージをスキャンする メッセージ履歴に保存される前に。

APIはCloudflareのエッジネットワーク上のメモリ内のテキストを処理し、応答後にテキストを破棄します。 Botoi 側ではデータは保存または記録されません。 これを確認するには、 APIドキュメント エンドポイントのプライバシー保証のため。

FAQ

API はどのような PII タイプを検出しますか?
API は、電子メール アドレス、電話番号、社会保障番号 (SSN)、クレジット カード番号、IP アドレス、生年月日の 6 種類を検出します。 各検出結果には、タイプ、生の値、文字の位置、およびマスクされたバージョンが含まれます。
PII 検出 API は無料ですか?
はい。 匿名アクセスは、IP ベースのレート制限により、1 分あたり 5 リクエストで利用できます。 API キー、アカウント、クレジット カードは必要ありません。 有料プランでは、より高いレート制限が提供されます。
API は送信したテキストを保存または記録しますか?
いいえ。API はエッジの Cloudflare ワーカー上で実行されます。 テキストはメモリ内で処理され、応答が返された後に破棄されます。 ディスクには何も書き込まれず、ログにも記録されません。
これを GDPR 準拠に使用できますか?
API は、保存前に PII を特定するのに役立ち、GDPR 第 5 条 (1) (c) に基づくデータの最小化をサポートします。 これは技術的なツールであり、法的なアドバイスではありません。 組織のデータ保護ポリシーと組み合わせて、コンプライアンスに関する質問については法律の専門家に相談してください。
検出の精度はどの程度ですか?
API は、一般的な形式 (米国の電話番号、標準の電子メール アドレス、Luhn で有効なクレジット カード番号など) に合わせて調整されたパターン マッチングを使用します。 最も一般的な PII パターンを捕捉します。 ドメイン固有の形式または米国以外の識別子の場合は、独自のデータを使用してテストして、カバレッジを確認してください。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。