Перейти к содержимому
Tutorial

Сканируйте вводимые пользователем данные на предмет личных данных перед их сохранением с помощью одного вызова API.

| 6 min read

Обнаруживайте и редактируйте электронные письма, номера телефонов, SSN, кредитные карты и IP-адреса в тексте до того, как он попадет в вашу базу данных. Бесплатный API для обнаружения PII, не требующий учетной записи.

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

Клиент отправляет заявку в службу поддержки и вставляет в описание номер своей кредитной карты. Пользователь заполняет форму обратной связи и указывает свой номер социального страхования. Внутренний инструмент регистрирует полное тело запроса, и теперь ваш агрегатор журналов сохраняет адреса электронной почты. и номера телефонов, которые вы никогда не просили.

Это наиболее распространенный способ, которым компании собирают личную информацию, которая им не нужна. Это не запрос функции пошло не так; это ввод произвольного текста, который делает то же, что и ввод произвольного текста. А в соответствии со статьей 5(1)(c) GDPR: хранение ненужных вам персональных данных нарушает принцип минимизации данных.

Исправление: сканируйте текст на предмет личных данных *прежде*, чем он попадет в вашу базу данных. Один вызов API перехватывает электронную почту, номера телефонов, SSN, номера кредитных карт, IP-адреса и даты рождения.

Один вызов 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 обнаружил во входных данных два элемента, позволяющие идентифицировать личность: адрес электронной почты и номер телефона. Каждая находка включает в себя позиции персонажей (start и end), чтобы вы могли заменять, редактировать, или отметьте точную подстроку.

Поддерживаемые типы личных данных

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 сканируются поля заявки в службу поддержки и отклоняются заявки, содержащие персональные данные.

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: «Ввод произвольного текста сканируется на предмет PII на уровне API. Представления, содержащие персональные данные, отклоняются до сохранения».

Где добавить сканирование PII в ваш стек

  • Промежуточное программное обеспечение API. Сканируйте тела запросов до того, как они достигнут вашей бизнес-логики. Перехватывает PII в точке входа в вашу систему.
  • Проверка формы. Перед отправкой формы вызовите API на стороне клиента или сервера. Дайте пользователям возможность самостоятельно удалить персональные данные.
  • Журнальный конвейер. Редактируйте личные данные в сообщениях журнала, прежде чем они попадут в агрегатор журналов. Предотвращает распространение конфиденциальных данных по вашей инфраструктуре.
  • Экспорт данных. Сканируйте экспортированные файлы CSV или JSON перед отправкой их третьим лицам. Еще одна контрольная точка, прежде чем данные покинут вашу систему.
  • Чат и обмен сообщениями. Сканируйте сообщения во внутренних инструментах или в чате для клиентов. прежде чем они будут сохранены в вашей истории сообщений.

API обрабатывает текст в памяти в периферийной сети Cloudflare и удаляет его после ответа. Никакие данные не сохраняются и не регистрируются на стороне Ботоя. Вы можете убедиться в этом, проверив Документация по API для гарантий конфиденциальности конечной точки.

FAQ

Какие типы PII обнаруживает API?
API обнаруживает шесть типов: адреса электронной почты, номера телефонов, номера социального страхования (SSN), номера кредитных карт, IP-адреса и даты рождения. Каждый результат включает тип, необработанное значение, позицию символа и замаскированную версию.
Является ли API обнаружения PII бесплатным?
Да. Анонимный доступ возможен со скоростью 5 запросов в минуту с ограничением скорости по IP. Ни ключ API, ни учетная запись, ни кредитная карта не требуются. Платные планы предлагают более высокие лимиты ставок.
Сохраняет ли API отправляемый мной текст?
Нет. API работает на рабочих серверах Cloudflare на периферии. Ваш текст обрабатывается в памяти и удаляется после возврата ответа. Ничего не записывается на диск и не регистрируется.
Могу ли я использовать это для соблюдения GDPR?
API помогает вам идентифицировать персональные данные перед сохранением, что поддерживает минимизацию данных в соответствии со статьей 5(1)(c) GDPR. Это технический инструмент, а не юридическая консультация. Сопоставьте его с политиками защиты данных вашей организации и проконсультируйтесь с юристом по вопросам соответствия.
Насколько точно обнаружение?
API использует сопоставление шаблонов, настроенное для распространенных форматов (номера телефонов в США, стандартные адреса электронной почты, действительные номера кредитных карт Luhn и т. д.). Он улавливает наиболее распространенные шаблоны PII. Для форматов, специфичных для домена, или идентификаторов, не относящихся к США, проверьте свои собственные данные, чтобы подтвердить покрытие.

Начните разработку с botoi

150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.