【问题标题】:How to mask credit card number mask in a text?如何在文本中掩盖信用卡号掩码?
【发布时间】:2018-10-19 04:16:28
【问题描述】:

我的网站上有一个表格,我的客户使用此表格向我发送消息。有时他们会在信息上写下他们的信用卡号。所以这真的很关键。我想掩盖这些信用卡号码。但当然卡号不会定期出现。

示例 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

结果 2:4444******** 1111

结果 3:4444********-1111

结果 4:4444******** - 1111

结果5:4444********--1111

那么我应该在正则表达式中做什么?谢谢。

【问题讨论】:

  • 你只是想遮住中间的两个部分吗?
  • 是的,前 4 个和后 4 个不会被屏蔽。

标签: regex regex-negation


【解决方案1】:

我可以建议您将信用卡号的验证与通过 UI 向用户提供的该号码的显示分开吗?假设您只存储了有效的信用卡号码,那么假设每个号码至少有 8 位数字可能是安全的。如果是这样,那么您可以只使用一揽子正则表达式来仅显示前 4 位和后 8 位数字:

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

4444********1111

Demo

您可能会指出,这会在每个卡号之间放置相同数量的星号。但是,话又说回来,这是一件好事,因为它使窥探者更难找出真正未掩盖的数字到底是什么。

编辑:

这是一个更智能的正则表达式,它会在任何数字的中间部分加注星号,只留下第一个和最后 4 个字符可见:

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

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

请注意,此解决方案不会从 11114444 中删除任何内容作为理论输入。

【讨论】:

  • 它掩盖了文本中的所有数字。例如 44443333 就像 4444********3333 一样屏蔽。所以这并不完全没问题。
  • @MahmutTuncer 你知道任何只有 8 位数字的信用卡吗?这将是一个安全风险。
  • 您可以毫无风险地将信用卡的前 4 位和后 6 位保存在数据库中。您无法保存 cvv。
  • 嗯?这和你的问题有什么关系?您不存储整个 CC 号码吗?如果您已经将前 4 位和后 4 位数字作为单独的列,那么为什么不能构建屏蔽字符串?
  • 我无法存储整个抄送号码。但有时客户会在有关其交易的消息中发送他们的抄送号码。所以你知道,你不能在不加掩码的情况下将所有信用卡数字存储在任何地方。
【解决方案2】:

检查下一个正则表达式\b([3-6]\d{3})(?: *-* *\d{4}){2} *-* *(\d{4})\b

【讨论】:

    【解决方案3】:

    如何在文本中屏蔽信用卡号掩码[with regex]

    不要。

    有时他们会在消息上写下他们的信用卡号码。

    他们真的不应该。不要鼓励这种行为。不是PCI compliant

    什么是 PCI 合规性?

    支付卡行业数据安全标准 (PCI DSS) 适用于接受信用卡付款的任何规模的公司。如果您的公司打算接受卡付款并存储处理传输持卡人数据,您需要使用符合 PCI 的安全托管数据托管服务提供商。

    当您通过网站接受信用卡数据时,请使用经批准的服务提供商,如 Stripe、PayPal、BlueSnap、SecurionPay 等。这些服务非常受欢迎,不是因为很难制作支付系统,而是因为它们是很难纠正(和合法)。他们都有 PHP API,因此您可以让人们输入您从未见过的信用卡数据,并仍然按照您同意的金额向他们收费。

    例如,如果您正在使用 Stripe,并且您希望告知您的客户他们使用的是哪张信用卡,their card object has a last4 property 提供了卡的最后四位数字:此时您永远不知道完整的信用卡号,您甚至不必考虑给前四个后四个是否违反安全规定。

    Further guidelines:

    切勿以任何形式存储电子轨道数据或卡安全号

    虽然您可能出于商业原因存储信用卡信息,但处理法规明确禁止存储卡的安全代码或包含在信用卡背面磁条中的任何“轨道数据”信用卡。

    信用卡安全号码(包括 CVV2、CID 和 CSC)是 Visa/MasterCard/Discover 卡背面的三位数字或美国运通卡正面的 4 位数字。它旨在为商家提供一种方法,以了解通过电话或互联网授权交易的客户是否实际持有该卡。这种方法只有在安全代码从未与卡号一起存储时才有效。电子存储使这变得容易。您只需不为安全代码创建字段。对于纸质存储,您需要在成功处理交易后和存储纸质授权表格之前编辑(用黑笔划掉以使不可读)安全代码。 [...]

    显然,您不应故意存储安全代码或跟踪数据。但是,您还需要确保不会无意中存储它。为此,请务必仅使用经批准的硬件和软件[...]

    确保信用卡帐号的所有电子存储都经过加密,所有纸质存储都是安全的

    [...] 信用卡号码的电子存储也很常见,例如,如果您处理经常性或重复交易。如果您这样做,您需要确保您永远不要以未加密的方式存储这些文件。您需要确保任何电子存储都使用强大的加密算法加密。这样一来,如果您的计算机被盗或您办公室中的某个人获得未经授权的访问权限,您的信用卡号就会受到一定程度的保护。

    有许多服务提供商提供安全存储 - 作为独立服务或作为支付处理包的一部分。这些服务通常为您提供他们存储的卡号的“令牌”。您可以将令牌存储在任何不安全的文件中。当您准备好处理付款时,您只需向服务提供商发送令牌,它就会检索完整的卡号,仅用于处理付款。 (技术上比这更复杂,但你明白了。)一定要使用经过 PCI DSS 验证的提供商 [...]

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2011-01-28
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2018-07-13
      • 1970-01-01
      相关资源
      最近更新 更多