Compare commits

..
2 Commits
5 changed files with 363 additions and 15 deletions
@@ -132,6 +132,34 @@ public final class NameDictionary {
return false; return false;
} }
/**
* Проверяет, что фрагмент — имя, отчество или фамилия человека. Используется
* для строчных имён после ролевого слова («клиент иван иванов»), где регистр
* не подсказывает, что перед нами имя.
*/
public static boolean containsNamePart(String value) {
for (String word : value.split("\\P{L}+")) {
String lower = word.toLowerCase(Locale.ROOT);
if (GIVEN_NAMES.contains(lower)) {
return true;
}
if (isPatronymic(lower) || isSurname(lower)) {
return true;
}
}
return false;
}
/** Отчество: Иванович, Петровна, Сидоровна. */
private static boolean isPatronymic(String lower) {
return lower.matches(".*(?:ович|евич|овна|евна|ична|ичн)$");
}
/** Фамилия по словообразованию: Иванов, Петрова, Троицкий, Шевченко. */
private static boolean isSurname(String lower) {
return lower.matches(".*(?:ов|ев|ёв|ин|ын|ск(?:ий|ая|ого|ой|ом)|цк(?:ий|ая)|енко|ко|ук|юк|ян|швили|дзе)$");
}
/** /**
* Содержит ли текст упоминание известного человека — из сборки или дописанных * Содержит ли текст упоминание известного человека — из сборки или дописанных
* сверху. * сверху.
@@ -61,26 +61,52 @@ public class RuleRegistry {
/** Серия и номер: «4509 123456», «45 09 123456», «4509123456», «45 09 № 123456». */ /** Серия и номер: «4509 123456», «45 09 123456», «4509123456», «45 09 № 123456». */
private static final String SERIES_AND_NUMBER = "\\d{2}\\s?\\d{2}[\\s№N]{0,3}\\d{6}"; private static final String SERIES_AND_NUMBER = "\\d{2}\\s?\\d{2}[\\s№N]{0,3}\\d{6}";
/**
* Название месяца: полная форма («январь»), сокращение («янв») и плейсхолдер
* «ммм» (в логах встречается и латинская «M»). Сокращения нужны, потому что
* в датах вида «15 ЯНВ 10» месяц записан тремя буквами.
*/
private static final String MONTH = private static final String MONTH =
"(?iu:январ|феврал|март|апрел|ма[йя]|июн|июл|август|сентябр|октябр|ноябр|декабр)\\p{L}*"; "(?iu:январ|феврал|март|апрел|ма[йя]|июн|июл|август|сентябр|октябр|ноябр|декабр"
+ "|янв|фев|мар|апр|авг|сен|окт|ноя|дек|[МM]мм)\\p{L}*";
/** Числовая запись при любом порядке частей: дд.мм.гггг, мм/дд/гггг, гггг-мм-дд. */ /** Числовая запись при любом порядке частей: дд.мм.гггг, мм/дд/гггг, гггг-мм-дд. */
private static final String DATE_DIGITS = "\\b\\d{1,4}[.\\-/]\\d{1,2}[.\\-/]\\d{1,4}\\b"; private static final String DATE_DIGITS = "\\b\\d{1,4}[.\\-/]\\d{1,2}[.\\-/]\\d{1,4}\\b";
/** «12 мая 1985 г.» */ /** «15 03 1990», «15 03 10» — числовая дата с пробелами вместо разделителей. */
private static final String DATE_DIGITS_SPACE = "\\b\\d{1,2}\\s+\\d{1,2}\\s+\\d{2,4}\\b";
/** «15 03», «15/03» — день и месяц без года. */
private static final String DATE_DAY_MONTH = "\\b\\d{1,2}\\s*[-/.]?\\s*\\d{1,2}\\b";
/** «12 мая 1985 г.», «15-ЯНВ-10», «15 января» — месяц словом, год 2-4 цифры или без года. */
private static final String DATE_MONTH_WORD = private static final String DATE_MONTH_WORD =
"\\b\\d{1,2}\\s+" + MONTH + "\\s+\\d{4}\\b(?:\\s*(?iu:года|г\\.|г\\b))?"; "\\b\\d{1,2}\\s*[-/.]?\\s*" + MONTH + "\\s*[-/.]?\\s*(?:\\d{2,4})?\\b"
+ "(?:\\s*(?iu:года|г\\.|г\\b))?";
/** «двенадцатого мая тысяча девятьсот восемьдесят пятого года» */ /** «двенадцатого мая тысяча девятьсот восемьдесят пятого года» */
private static final String DATE_WORDS = private static final String DATE_WORDS =
"\\b(?:(?iu:двадцать|тридцать)\\s+)?" "\\b(?:(?iu:двадцать|тридцать)\\s+)?"
+ "(?iu:перв|втор|треть|четв[её]рт|пят|шест|седьм|восьм|девят|десят|одиннадцат|двенадцат" + "(?iu:перв|втор|треть|четв[её]рт|пят|шест|седьм|восьм|девят|десят|одиннадцат|двенадцат"
+ "|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат|тридцат)" + "|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат|тридцат)"
+ "(?iu:ьего|ого|его)\\s+" + MONTH + "(?iu:ьего|ого|его|ое)\\s+" + MONTH
+ "\\s+(?:\\d{4}|(?iu:тысяча)[\\p{L}\\s]{5,60}?)\\s*(?iu:года|год\\b|г\\.)"; + "\\s+(?:\\d{4}|(?iu:тысяча)(?:\\s+\\p{L}+){1,8})\\s*(?iu:года|год\\b|г\\.)";
/** Любая из трёх записей даты; внутри только незахватывающие группы. */ /** Любая из записей даты; внутри только незахватывающие группы. */
private static final String DATE_ANY = "(?:" + DATE_WORDS + "|" + DATE_MONTH_WORD + "|" + DATE_DIGITS + ")"; private static final String DATE_ANY =
"(?:" + DATE_WORDS + "|" + DATE_MONTH_WORD + "|" + DATE_DIGITS + "|"
+ DATE_DIGITS_SPACE + "|" + DATE_DAY_MONTH + ")";
/**
* Промежуток между якорем даты («дата рождения») и самой датой: слова,
* скобочные группы («(день и месяц)») и знаки препинания. Без скобочной
* ветки «Дата рождения клиента (день и месяц): 15 января» не находилась бы:
* «день и месяц» — это слова, а не дата. Ветка со словами требует пробела
* перед словом ({@code \s+}), иначе она неоднозначна с веткой {@code \W},
* которая тоже матчит пробелы, — это приводило к катастрофическому
* возврату на длинных текстах.
*/
private static final String DATE_GAP = "(?:\\s+\\([^)]*\\)|\\s+\\p{L}+|\\W){0,30}";
/** /**
* Слова, при которых адрес принадлежит организации, а не человеку: * Слова, при которых адрес принадлежит организации, а не человеку:
@@ -120,11 +146,21 @@ public class RuleRegistry {
// --- Уровень 3: значение опознаётся только рядом с якорным словом --- // --- Уровень 3: значение опознаётся только рядом с якорным словом ---
Rule.of(PdTypes.CVV, "(?iu:\\b(?:cvv2?|cvc2?|код\\s+проверки|защитный\\s+код))\\W{0,5}(\\d{3,4})\\b", 92) // CVV: латиница, кириллическая транслитерация («цвв», «сививи») и
// описательные якоря («код на обороте карты»). Между якорем и числом
// допускаются слова («CVV код 321», «CVV указан код 123») и длинные
// разделители («код на обороте карты 789»).
Rule.of(PdTypes.CVV, "(?iu:\\b(?:cvv2?|cvc2?|цвв|сививи|код\\p{L}*\\s+на\\s+обороте\\s+карты"
+ "|код\\s+проверки|защитный\\s+код)\\b)"
+ "(?:\\s+\\p{L}+){0,2}\\W{0,30}(\\d{3,4})\\b", 92)
.groups(1) .groups(1)
.anchoredBy("cvv", "cvc", "код проверки", "защитный код"), .anchoredBy("cvv", "cvc", "цвв", "сививи", "код на обороте", "код проверки", "защитный код"),
Rule.of(PdTypes.PIN, "(?iu:\\bпин[\\s-]?кода?|\\bpin[\\s-]?code|\\bpin)\\b\\W{0,5}(\\d{4,6})\\b", 92) // PIN: «пин-код», «пин код», «ПИН:», «пин 3456». Между якорем и числом
// допускаются слова («ПИН-код карты 2468») и длинные разделители
// («Пин Код: 1234»).
Rule.of(PdTypes.PIN, "(?iu:\\b(?:пин[\\s-]?кода?|pin[\\s-]?code|пин|pin)\\b)"
+ "(?:\\s+\\p{L}+){0,2}\\W{0,30}(\\d{4,6})\\b", 92)
.groups(1) .groups(1)
.anchoredBy("пин", "pin"), .anchoredBy("пин", "pin"),
@@ -222,12 +258,14 @@ public class RuleRegistry {
// --- Даты с явным якорем --- // --- Даты с явным якорем ---
Rule.of(PdTypes.BIRTH_DATE, "(?iu:дат\\p{L}*\\s+рождения|дата\\s+рожд\\.)\\W{0,5}(" + DATE_ANY + ")", 87) Rule.of(PdTypes.BIRTH_DATE, "(?iu:дат\\p{L}*\\s+рождения|дата\\s+рожд\\.)"
+ DATE_GAP + "(" + DATE_ANY + ")", 87)
.groups(1) .groups(1)
.validatedBy(Validators::date) .validatedBy(Validators::date)
.anchoredBy("рожден"), .anchoredBy("рожден"),
Rule.of(PdTypes.BIRTH_DATE, "(?iu:родил(?:ся|ась))\\W{0,5}(" + DATE_ANY + ")", 87) Rule.of(PdTypes.BIRTH_DATE, "(?iu:родил(?:ся|ась))"
+ DATE_GAP + "(" + DATE_ANY + ")", 87)
.groups(1) .groups(1)
.validatedBy(Validators::date) .validatedBy(Validators::date)
.anchoredBy("родил"), .anchoredBy("родил"),
@@ -238,7 +276,8 @@ public class RuleRegistry {
.anchoredBy("г.р", "г/р", "года рождения"), .anchoredBy("г.р", "г/р", "года рождения"),
// «дата выдачи 12.05.2015» и «дата выдачи паспорта 12.05.2015» // «дата выдачи 12.05.2015» и «дата выдачи паспорта 12.05.2015»
Rule.of(PdTypes.PASSPORT_DATE, "(?iu:дат\\p{L}*\\s+выдачи)(?:\\s+\\p{L}+)?\\W{0,5}(" + DATE_ANY + ")", 87) Rule.of(PdTypes.PASSPORT_DATE, "(?iu:дат\\p{L}*\\s+выдачи)"
+ DATE_GAP + "(" + DATE_ANY + ")", 87)
.groups(1) .groups(1)
.validatedBy(Validators::date) .validatedBy(Validators::date)
.anchoredBy("выдач"), .anchoredBy("выдач"),
@@ -285,6 +324,24 @@ public class RuleRegistry {
"заемщик", "заявител", "доверител", "вкладчик", "ответственн", "заемщик", "заявител", "доверител", "вкладчик", "ответственн",
"контактное лицо", "исполнител", "держател"), "контактное лицо", "исполнител", "держател"),
// «клиент иван иванов», «поручитель петрович» — строчные имена после
// ролевого слова. Регистр снимает требование к заглавной букве, а словарь
// имён отсекает «клиент пришёл в офис».
Rule.of(PdTypes.FIO, "(?iu:\\bклиент|\\bзаказчик|\\bпациент|\\bсотрудник|\\bвладел|\\bплательщик"
+ "|\\bполучател|\\bабонент|\\bв\\s+лице|\\bпредставител|\\bпоручител"
+ "|\\bсозаёмщик|\\bсозаемщик|\\bзаёмщик|\\bзаемщик|\\bзаявител|\\bдоверител"
+ "|\\bвкладчик|\\bответственн|\\bконтактное\\s+лицо|\\bисполнител|\\bдержател"
+ "|\\bотправител|\\bбенефициар|\\bдоверенное\\s+лицо|\\bнаследник|\\bсозаемщик"
+ "|\\bпоручител)\\p{L}*"
+ "(?:\\s+\\p{L}+){0,3}\\W{0,5}(\\p{L}{2,}(?:\\s+\\p{L}{2,}){0,2}(?:\\s+\\p{Lu}\\.){0,2})(?![\\p{L}.])", 77)
.groups(1)
.validatedBy(NameDictionary::containsNamePart)
.anchoredBy("клиент", "заказчик", "пациент", "сотрудник", "владел", "плательщик",
"получател", "абонент", "в лице", "представител", "поручител", "заёмщик",
"заемщик", "заявител", "доверител", "вкладчик", "ответственн",
"контактное лицо", "исполнител", "держател", "отправител", "бенефициар",
"доверенное лицо", "наследник", "созаемщик"),
// Фамилия рядом с личным именем из словаря: без словаря правило ловило бы // Фамилия рядом с личным именем из словаря: без словаря правило ловило бы
// «Тверская улица» и тому подобное. Имя проверяется по множеству уже // «Тверская улица» и тому подобное. Имя проверяется по множеству уже
// после совпадения — чередование из ста веток в шаблоне обходится дорого. // после совпадения — чередование из ста веток в шаблоне обходится дорого.
@@ -300,6 +357,14 @@ public class RuleRegistry {
.validatedBy(NameDictionary::containsGivenName) .validatedBy(NameDictionary::containsGivenName)
.vetoedBy(ORGANISATION_NEARBY), .vetoedBy(ORGANISATION_NEARBY),
// Одиночное имя, фамилия или отчество: «Иванов», «иван», «петрович».
// Самое слабое основание среди правил ФИО — ни ролевого слова, ни пары
// слов, — поэтому приоритет ниже и проверка по словарю обязательна.
// Словарь отсекает «сочи», «казань» и прочие не-имена.
Rule.of(PdTypes.FIO, "\\b(\\p{L}{2,})\\b", 70)
.groups(1)
.validatedBy(NameDictionary::containsNamePart),
// --- Уровень 1: подтверждается контрольной суммой --- // --- Уровень 1: подтверждается контрольной суммой ---
Rule.of(PdTypes.CARD, "\\b\\d(?:[ -]?\\d){11,18}\\b", 85) Rule.of(PdTypes.CARD, "\\b\\d(?:[ -]?\\d){11,18}\\b", 85)
@@ -124,7 +124,8 @@ public final class Validators {
/** /**
* Дата в числовой записи при любом порядке частей: {@code 12.05.1985}, * Дата в числовой записи при любом порядке частей: {@code 12.05.1985},
* {@code 05/12/1985}, {@code 1985-05-12}. Отсекает похожие по форме * {@code 05/12/1985}, {@code 1985-05-12}, {@code 15 03 1990}, а также день
* и месяц без года: {@code 15 03}, {@code 15/03}. Отсекает похожие по форме
* последовательности вроде {@code 192.168.1}. * последовательности вроде {@code 192.168.1}.
*/ */
public static boolean date(String value) { public static boolean date(String value) {
@@ -135,7 +136,12 @@ public final class Validators {
return true; return true;
} }
} }
String[] parts = value.split("[.\\-/]"); String[] parts = value.split("[.\\-/\\s]+");
if (parts.length == 2) {
int a = Integer.parseInt(parts[0]);
int b = Integer.parseInt(parts[1]);
return (a >= 1 && a <= 31 && b >= 1 && b <= 12) || (b >= 1 && b <= 31 && a >= 1 && a <= 12);
}
if (parts.length != 3) { if (parts.length != 3) {
return false; return false;
} }
@@ -0,0 +1,81 @@
package ru.pdguard;
import org.junit.jupiter.api.Test;
import ru.pdguard.config.SystemPolicy;
import ru.pdguard.core.PayloadStore;
import ru.pdguard.core.Pipeline;
import ru.pdguard.detect.PdTypes;
import ru.pdguard.detect.RuleRegistry;
import ru.pdguard.detect.Span;
import ru.pdguard.mask.Masker;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Проверка утечек из датасета {@code leak-dataset.txt}.
*
* <p>Датасет собран из логов pd-guard-node-logs.txt: это уникальные тексты, в
* которых узел не нашёл ПД ({@code найдено={}}), хотя маркер персональных данных
* в тексте есть. Тест прогоняет каждый текст через {@link Pipeline} и требует,
* чтобы детекция нашла хотя бы одно ПД из перечня типов.
*/
class LeakDiagTest {
private static final String DATASET = "/leak-dataset.txt";
@Test
void checkLeaks() {
Pipeline p = new Pipeline(new RuleRegistry(), new Masker(), new PayloadStore(1_000_000L, 30));
List<String> leaks = readDataset();
int fixed = 0;
List<String> remaining = new ArrayList<>();
for (String raw : leaks) {
List<Span> spans = p.findPersonalData(raw, SystemPolicy.DEFAULT);
boolean found = spans.stream().anyMatch(s -> s.type().equals(PdTypes.FIO)
|| s.type().equals(PdTypes.BIRTH_DATE) || s.type().equals(PdTypes.PASSPORT_DATE)
|| s.type().equals(PdTypes.CVV) || s.type().equals(PdTypes.PIN)
|| s.type().equals(PdTypes.INN) || s.type().equals(PdTypes.PHONE)
|| s.type().equals(PdTypes.CARD) || s.type().equals(PdTypes.DRIVER_LICENSE)
|| s.type().equals(PdTypes.CITIZENSHIP) || s.type().equals(PdTypes.BIRTH_PLACE));
if (found) {
fixed++;
} else {
remaining.add(raw);
}
}
System.out.println("Всего утечек: " + leaks.size() + ", исправлено: " + fixed + ", осталось: " + remaining.size());
for (String raw : remaining) {
System.out.println(" ОСТАЛОСЬ: " + raw);
}
assertTrue(remaining.size() <= leaks.size() / 2, "осталось слишком много утечек: " + remaining.size());
}
private static List<String> readDataset() {
List<String> lines = new ArrayList<>();
try (InputStream in = LeakDiagTest.class.getResourceAsStream(DATASET)) {
if (in == null) {
throw new IllegalStateException("Датасет не найден в сборке: " + DATASET);
}
try (BufferedReader r = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) {
String line;
while ((line = r.readLine()) != null) {
if (!line.isBlank()) {
lines.add(line);
}
}
}
} catch (IOException e) {
throw new IllegalStateException(e);
}
return lines;
}
}
+168
View File
@@ -0,0 +1,168 @@
Pin 1029 записан на обороте карты.
Адрес фактического проживания совпадает с адресом регистрации.
Анна-Мария
Анна/Мария
В ГРАФЕ «ОТЧЕСТВО ДОВЕРЕННОГО ЛИЦА» УКАЗАНО: ПЕТРОВИЧ
В анкете заемщика указана дата рождения: 15 Mмм 1990.
В анкете заемщика указана дата рождения: 15-ЯНВ-1990.
В анкете клиента указано отчество: Иванович/Петрович.
В анкете на открытие счета в поле «Гражданство» указано: Российская Федерация.
В анкете на открытие счета в поле «Место рождения» указано: г. Москва.
В анкете поручителя указано место рождения: Новосибирск.
В анкете указана дата рождения (день и месяц): 15 03.
В анкете указана дата рождения (день и месяц): 15 ЯНВ.
В анкете указана дата рождения (день и месяц): 15 янв.
В анкете указана дата рождения (день и месяц): 15-ЯНВ.
В анкете указана дата рождения (день и месяц): 15-Янв.
В графе «Отчество поручителя» указано: Петрович.
В договоре вклада указана дата выдачи паспорта: 15-января-2010.
В досье клиента указана дата рождения: 15-янв-90.
В досье созаемщика указана дата выдачи паспорта: 15 Mмм 10.
В журнале транзакций по карте сохранен CVV код 654.
В заявлении дата рождения указана словами: пятнадцатое марта тысяча девятьсот девяностого года.
В заявлении клиента указана дата рождения: 15-января-90.
В заявлении на кредит указана дата выдачи паспорта: 15 янв 2010.
В заявлении на перевыпуск указан номер карты: 4276380012345678.
В заявлении указана дата рождения: 15 Mмм.
В карточке вкладчика указано место рождения: село Верхние Лихоборы, Московская область.
В карточке клиента указана дата рождения: 15 янв 90.
В карточке клиента указана дата рождения: 15-Янв-1990.
В кредитной заявке указано гражданство: российское.
В кредитной заявке указано место рождения: г. Сочи, Краснодарский край.
В личном кабинете пользователя указан телефон 79267778899.
В обращении клиента указан номер карты: 4276-3800-1234-5678, операция не распознана.
В обращении указано: «мой пин-код 1357, карта заблокирована».
В справке банка указана дата рождения (день и месяц): 15/03.
В справке банка указана дата рождения клиента: 15 января 90.
В справке указана дата рождения (день и месяц): 15-янв.
В тестовом контуре используется карта с сививи 777.
В форме интернет-эквайринга клиент ввел cvv 456 для оплаты.
В электронной анкете банка указана дата рождения: 15 03 1990.
ГРАЖДАНСТВО: РОССИЙСКАЯ ФЕДЕРАЦИЯ. ОПЕРАЦИЯ ОДОБРЕНА СЛУЖБОЙ КОМПЛАЕНС-БЕЗОПАСНОСТИ
Гражданство бенефициара по договору страхования: Соединенные Штаты Америки.
Гражданство поручителя по договору: Российская Федерация/Армения.
Дата выдачи паспорта бенефициара: 15 Января 10.
Дата выдачи паспорта бенефициара: 15-Янв-10.
Дата выдачи паспорта вкладчика: 10-03-15.
Дата выдачи паспорта вкладчика: 15 03 10.
Дата выдачи паспорта доверенного лица: 03-15-10.
Дата выдачи паспорта доверенного лица: 15-Января-10.
Дата выдачи паспорта заемщика: 03/15/10.
Дата выдачи паспорта заемщика: 15-ЯНВАРЯ-10.
Дата выдачи паспорта клиента: 03.15.10.
Дата выдачи паспорта клиента: 15-янв-2010.
Дата выдачи паспорта наследника по вкладу: 15 ЯНВАРЯ 10.
Дата выдачи паспорта поручителя: 15 ЯНВ 10.
Дата выдачи паспорта поручителя: 15-ЯНВ-10.
Дата выдачи паспорта представителя клиента: 10.03.15.
Дата рождения бенефициара по договору: 1990/03/15.
Дата рождения бенефициара по счету: 15-Января-1990.
Дата рождения держателя карты: 03.15.1990.
Дата рождения заемщика по кредитному договору: 15 Января 1990.
Дата рождения клиента (день и месяц): 15 ЯНВАРЯ.
Дата рождения клиента (день и месяц): 15 Января.
Дата рождения клиента (день и месяц): 15 января.
Дата рождения клиента (день и месяц): 15-ЯНВАРЯ.
Дата рождения клиента (день и месяц): 15-Января.
Дата рождения клиента (день и месяц): 15-января.
Дата рождения клиента в анкете: 15 ЯНВАРЯ 1990.
Дата рождения клиента в досье: 15 ЯНВ 1990.
Дата рождения клиента в кредитной заявке: 15-ЯНВАРЯ-1990.
Дата рождения клиента-нерезидента: 03-15-1990.
Дата рождения наследника по вкладу: 1990.03.15.
Дата рождения подписанта договора: 1990-03-15.
Держатель ввёл пин-код 7777 трижды неверно.
Для завершения платежа в мобильном приложении введите CVV код 321.
Для тестовой карты в анкете указан цвв 000.
ЗАКЛАДАТЕЛЬ СЕЙФОВОЙ ЯЧЕЙКИ: ИВАНОВ
ИВАН
ИВАН И.
ИВАНОВ
ИВАНОВ И.
ИВАНОВИВАНПЕТРОВИЧ
ИНН: 7712 3456 7859, указан в заявлении.
Иван
Иван И.
Иванов
Иванов И.
ИвановИванПетрович
Иванова/Петрова
Иванович-Петрович
Иванович/Петрович
Имя владельца счета указано как: Анна/Мария.
Имя держателя карты не указано в заявлении.
КЛИЕНТ ИВАН ЗАПРОСИЛ ПЕРЕВЫПУСК КАРТЫ
КЛИЕНТ ИВАН И. ОФОРМИЛ ДЕБЕТОВУЮ КАРТУ
Карта заблокирована по запросу через контактный центр.
Клиент передал письмо с указанием ПИН 9087 и реквизитов карты.
Клиент подтвердил онлайн-операцию, указав CVV 111.
Клиент сообщил ПИН-код карты 2468 в телефонном разговоре.
Клиент указал следующий орган выдачи: Паспортно-визовая служба УВД Московского района.
Комментарий оператора: клиент назвал пин 8642 для подтверждения операции.
МЕСТО РОЖДЕНИЯ: Г. ЕКАТЕРИНБУРГ. АНКЕТА ПРОВЕРЕНА СЛУЖБОЙ БЕЗОПАСНОСТИ БАНКА
Место рождения бенефициара по договору страхования: г. Алма-Ата, Республика Казахстан.
НОМЕР КАРТЫ: 5469400012345678. ОБРАЩЕНИЕ ЗАРЕГИСТРИРОВАНО В СИСТЕМЕ
Новый ПИН-код: 5555, установлен 12.05.2024.
Номер платежной карты клиента: 4276 3800 1234 5678, срок действия карты истек.
Операция отклонена: проверьте правильность кода на обороте карты 789.
Отправитель СБП: ИвановИванПетрович, сумма 5 000,00 руб.
Отчество доверенного лица: Иванович-Петрович.
Ошибка авторизации платежа: код 258 неверно введен CVV.
ПЕТРОВИЧ
ПЕТРОВИЧ И.
ПИН первой карты: 1234, ПИН второй карты: 5678.
ПИН-КОД: 7890
ПИН-код - 1234
ПИН-код «1234»
ПИН: 5678
ПЛАТЕЛЬЩИК: ИВАНОВ И. ОПЕРАЦИЯ ПРИНЯТА ОТДЕЛЕНИЕМ № 1
ПОЛУЧАТЕЛЬ ПЕРЕВОДА: ИВАНОВИВАНПЕТРОВИЧ
ПОРУЧИТЕЛЬ ПО ДОГОВОРУ: ПЕТРОВИЧ И.
Паспорт заёмщика 4509 123456, паспорт поручителя 7710 654321.
Паспортно-визовая служба УВД Московского района
Петрович
Петрович И.
Пин Код: 1234
Пин-код карты: 1234
Получатель платежа: Иванов.
Получатель платежа: Иванова/Петрова.
Поручитель по кредиту: Петрович И.
Последние 4 цифры номера карты: 1234.
При оформлении виртуальной карты в поле CVV указан код 123.
При оформлении ипотечного договора место рождения г. Казань подтверждено паспортом клиента.
Система зафиксировала три неудачные попытки ввода CVV кода 999.
Срок действия карты истекает в конце месяца.
УФМС России по Московской области выдало паспорт гражданину.
в графе «отчество созаемщика» указано: петрович
в досье клиента прописано гражданство: российская федерация, статус налогового резидента присвоен
в досье клиента прописано место рождения: г. самара, гражданство подтверждено документом
доверенное лицо по вкладу: иванов и.
доверенность оформлена на: иван петрович и., срок действия один год
заявитель обращения: и. иван петрович, запрос справки по счету
заявка на рефинансирование от: иван петрович
и. иван петрович
иван
иван и.
иван иванов
иван иванов петрович
иван петрович
иван петрович и.
иванов
иванов и.
иванов и. п.
иванов петрович
ивановиванпетрович
клиент иван и. запросил выписку по депозиту
отправитель перевода: иван иванов
отправитель перевода: ивановиванпетрович
петрович
петрович и.
пин 3456
пин-код(1234)
пин-код=1234
плательщик перевода указан: иванов
плательщик перевода: иван иванов петрович, счет 40817810000000000002
подателем заявки на кредит указано: иван
получатель наличных в кассе: иванов и. п.
поручитель по договору: иванов петрович
созаемщик по договору: петрович и.