Как замаскировать маску номера кредитной карты в тексте? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть форма на моем сайте, и мои клиенты отправляют мне сообщение с этой формой. Иногда они пишут номер своей кредитной карты в сообщении. Так что это действительно важно. Я хочу замаскировать эти номера кредитных карт. Но, конечно, номера карт не приходят регулярно.

Пример 1: 1111222233334444

Пример 2: 4444 3333 2222 1111

Пример 3: 4444-3333-2222-1111

Пример 4: 4444 - 3333 - 2222 - 1111

Пример 5: 4444--3333--2222--1111

Таким образом, я могу маскировать, например, 1, 2 и 3. Но если между числами есть несколько пробелов или тире, я не могу.

И это мое последнее регулярное выражение:

preg_replace("/(?:\b| )([3456]\d{3})([ -]+){0,1}\d{4}([ -]+){0,1}\d{4}([ -]+){0,1}(\d{0})/", "$1********$2", $a1);

И результаты для этого регулярного выражения:

Результат 1: 4444 ********1111* 1023 *

Результат 2: 4444 ********1111* 1025 *

Результат 3: 4444 ******** - 1111

Результат 4: 4444 ******** - 1111

Результат 5: 4444 ******** - 1111

Так что мне делать в регулярных выражениях? Спасибо.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Проверьте следующее регулярное выражение \b([3-6]\d{3})(?: *-* *\d{4}){2} *-* *(\d{4})\b.

0 голосов
/ 09 мая 2018

Как замаскировать маску номера кредитной карты в тексте [с регулярным выражением] ?

Не.

Иногда они пишут номер своей кредитной карты в сообщении.

Они действительно не должны. Не поощряйте это поведение. Это не PCI-совместимый :

Что такое PCI-совместимость?

Стандарт безопасности данных индустрии платежных карт (PCI DSS) применяется к компаниям любого размера , которые принимают платежи по кредитным картам. Если ваша компания намерена принимать платежи по карте и хранить , обрабатывать и передавать данные владельца карты , вам необходимо безопасно разместить свои данные у поставщика услуг хостинга, совместимого с PCI.

Когда вы принимаете данные кредитной карты через веб-сайт, сделайте это с помощью утвержденного поставщика услуг, такого как Stripe, PayPal, BlueSnap, SecurionPay и т. Д. Эти услуги не очень популярны, потому что платежные системы сложно сделать, а потому что они трудно сделать правильно (и законно). Все они имеют PHP API, поэтому вы можете позволить людям вводить данные кредитных карт, которые вы никогда не видите, и при этом брать с них плату за суммы, с которыми вы согласны.

Например, если вы использовали Stripe и хотите сообщить своему клиенту, с какой кредитной картой он подписан, их объект card имеет свойство last4 , которое дает последние четыре цифры карта: на данный момент вы никогда не знали полный номер кредитной карты, и вам даже не приходилось задумываться о том, является ли предоставление первых четырех и последних четырех нарушением безопасности.

Дополнительные рекомендации :

Никогда не храните данные электронных треков или защитный номер карты в любой форме

Хотя у вас может быть деловая причина для хранения информации о кредитной карте, правила обработки специально запрещают хранение кода безопасности карты или любых «данных трека», содержащихся в магнитной полосе на обратной стороне кредита. карта.

Защитный номер карты, называемый многими аббревиатурами, включая CVV2, CID и CSC, представляет собой трехзначный номер на обратной стороне карточек Visa / MasterCard / Discover или четырехзначный номер на лицевой стороне карточек American Express. Он предназначен для того, чтобы предоставить продавцам возможность узнать, действительно ли клиент, авторизующий транзакцию по телефону или через Интернет, имеет карту в своем распоряжении. Этот подход работает только в том случае, если код безопасности никогда не сохраняется вместе с номером карты. Электронное хранилище делает это легко. Вы просто не создаете поле для кода безопасности. Для хранения бумаги вам необходимо отредактировать (вычеркнуть темной ручкой, чтобы сделать нечитабельным) код безопасности после успешной обработки транзакции и перед сохранением формы авторизации на бумаге. [...]

Очевидно, что вы не должны хранить ни коды безопасности, ни отслеживать данные преднамеренно. Но вы также должны быть уверены, что не случайно не сохранили его. Для этого обязательно используйте только утвержденное аппаратное и программное обеспечение . [...]

Убедитесь, что все электронные хранилища номеров счетов кредитных карт зашифрованы и все хранилища на бумаге защищены

[...] Электронное хранение номеров кредитных карт также распространено, например, если вы обрабатываете повторяющиеся или повторяющиеся транзакции. Если вы делаете это, вам нужно убедиться, что вы никогда не сохраняете эти файлы в незашифрованном виде . Необходимо убедиться, что любое электронное хранилище зашифровано с использованием надежного алгоритма шифрования . Таким образом, если ваш компьютер украден или кто-то в вашем офисе получает несанкционированный доступ, у вас есть определенный уровень защиты номеров кредитных карт.

Есть много поставщиков услуг, которые предлагают безопасное хранение - либо как отдельную услугу, либо как часть пакета обработки платежей. Эти службы обычно предоставляют вам «токен» для номера карты, которую они хранят. Вы можете хранить токен в любом незащищенном файле. Когда вы будете готовы обработать платеж, вы просто отправляете поставщику услуг токен, и он получает полный номер карты с единственной целью обработки платежа. (Это технически сложнее, чем это, но вы поняли.) Обязательно используйте проверенного поставщика PCI DSS [...]

0 голосов
/ 09 мая 2018

Могу ли я предложить вам отделить подтверждение номера вашей кредитной карты от презентации этого номера для ваших пользователей через пользовательский интерфейс? Предполагая, что вы сохранили только действительные номера кредитных карт, вероятно, можно с уверенностью предположить, что каждый номер имеет не менее 8 цифр. Если это так, то вы можете просто использовать регулярное выражение для отображения только первых 4 и 8 последних цифр:

$cc = "4444--3333--2222--1111";
echo preg_replace("/(\d{4}).*(\d{4})/", "$1********$2", $cc);

4444********1111

Демо

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

Edit:

Вот более умное регулярное выражение, которое помечает среднюю часть любого числа, оставляя видимыми только первые и последние 4 символа:

$cc = "4444--3333--2222--1111";
echo preg_replace("/(?<=.{4}).(?=.{4})/", "*", $cc);

4444**************1111

Обратите внимание, что это решение не приведет к удалению чего-либо из 11114444 в качестве теоретического ввода.

...