跳转到内容
Tutorial

扫描用户输入的 PII,然后通过一次 API 调用进行存储

| 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 到达数据库之前*扫描文本中的 PII。 一次 API 调用即可捕获电子邮件, 电话号码、SSN、信用卡号码、IP 地址和出生日期。

一次 API 调用即可检测 PII

将任何文本发送至 /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 在输入中发现两个 PII 项目:电子邮件地址和电话号码。 每项发现包括 字符位置 (startend)这样你就可以替换、编辑、 或标记确切的子字符串。

支持的 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。
  • 日志管道。 在日志消息到达日志聚合器之前对其进行编辑。 防止敏感数据在您的基础设施中传播。
  • 数据导出。 在将 CSV 或 JSON 导出发送给第三方之前扫描它们。 在数据离开系统之前还有一个检查点。
  • 聊天和消息传递。 扫描内部工具或面向客户的聊天中的消息 在它们存储在您的消息历史记录中之前。

该 API 处理 Cloudflare 边缘网络内存中的文本,并在响应后丢弃它。 botoi 端不存储或记录任何数据。 您可以通过检查来验证这一点 API文档 用于端点的隐私保证。

FAQ

API 检测哪些 PII 类型?
API 检测六种类型:电子邮件地址、电话号码、社会安全号码 (SSN)、信用卡号码、IP 地址和出生日期。 每个发现都包括类型、原始值、字符位置和屏蔽版本。
PII 检测 API 是免费的吗?
是的。 匿名访问的速度为每分钟 5 个请求,并具有基于 IP 的速率限制。 无需 API 密钥、无需帐户、无需信用卡。 付费计划提供更高的费率限制。
API 是否存储或记录我发送的文本?
不会。API 在边缘的 Cloudflare Workers 上运行。 您的文本将在内存中进行处理,并在返回响应后被丢弃。 没有任何内容写入磁盘或记录。
我可以用它来实现 GDPR 合规性吗?
该 API 可帮助您在存储之前识别 PII,这支持 GDPR 第 5(1)(c) 条规定的数据最小化。 它是一种技术工具,而不是法律建议。 将其与您组织的数据保护策略配对,并咨询法律专业人士以解决合规性问题。
检测的准确度如何?
该 API 使用针对常见格式(美国电话号码、标准电子邮件地址、Luhn 有效信用卡号等)调整的模式匹配。 它捕获最常见的 PII 模式。 对于特定于域的格式或非美国标识符,请使用您自己的数据进行测试以确认覆盖范围。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。