从Coldfusion中的备注字段替换信用卡号码

从Coldfusion中的备注字段替换信用卡号码,coldfusion,masking,Coldfusion,Masking,我有一个备忘录字段中的字符串,上面有一些信用卡,我想屏蔽数字,只显示最后4位数字。例如: <cfset str = "Her card no. is 1234567890123456 which is a bogus number."> 如何将str的值设置为: 她的卡号是*************3456,这是一个伪造的号码 像这样的怎么样。根据您的信用卡号范围,您可能需要更改regex数字匹配最大值: 更新日期:2018年7月2日 按照你在问题中提出的要求,使用以下方法获取数字

我有一个备忘录字段中的字符串,上面有一些信用卡,我想屏蔽数字,只显示最后4位数字。例如:

<cfset str = "Her card no. is 1234567890123456 which is a bogus number.">
如何将str的值设置为:

她的卡号是*************3456,这是一个伪造的号码


像这样的怎么样。根据您的信用卡号范围,您可能需要更改regex数字匹配最大值:

更新日期:2018年7月2日


按照你在问题中提出的要求,使用以下方法获取数字。这甚至会动态地改变数字

<cfset str="Her card no. is 1234567890123456  which is a bogus number.">
<cfset num=listGetAt(str,5,' ')>
<cfset card=right(num,4)>
<cfset card=listInsertAt(card,1,'************')>
<cfset card=listChangeDelims(card,'')>
<cfset card=replaceList(str,num,card)>
<cfdump var="#card#" />
如何将str的值设置为:

她的卡号是*************3456,这是一个伪造的号码

简单:

停止在文本字段中保存信用卡号

这是PCI合规性的噩梦。这种做法可能会导致您的公司在您接受审计时不再处理在线支付

您需要尽快停止此操作,并启动一个项目,以从所有以前的实体中清除未加密的CC编号,如下图所示。如果您要在系统的其他位置保存他们的抄送号码,则只需保存最后4位数字。然后,您可以在邮件中引用该字段

当评论/备忘录保存在任何地方时,您需要清除与CC号码、银行路线/账户和社会保险号码匹配的号码模式的数据

这看起来像是生产支持单上的内容,所以我建议您尽快改变这种做法。如果他们存档的抄送是伪造的,那么只需在备忘录中注明:

当前存档的卡号无效


我最近提出了一个不同的解决方案,后来在寻找其他解决方案时发现了这个问题。我最初的正则表达式没有检测到所有的信用卡格式—空格、破折号、无空格和错误屏蔽的Instagram和Google Plus URL,但这个正则表达式运行良好,使用Luhn算法只修改实际的信用卡值

使用AdobeColdFusion或Lucee查看博客条目,获取可编辑的实时演示。


尝试一些文字,比如她的卡号以3456结尾,这是一个伪造的号码,而不是屏蔽。用星号字符屏蔽至少会泄露卡的元信息,即卡的类型。我很好奇这个存储完整信用卡号的软件的上下文。我不想急于下结论,但PCI合规性的危险信号正在上升。就像@SamM一样,我担心你正在处理信用卡号码。关于信用卡、社会保险号码、,如此之多,以至于有一些非常大的公司只使用Stripe和其他支付网关等公司的第三方组件,因此数据从未真正通过其服务器,更不用说保存,这样黑客就可以访问或错误配置网页输出。我首先重申Adrian的回答,并说您不应该存储信用卡号码。第二,如果你必须掩盖敏感信息,不要在ColdFusion中这样做。通过您使用的任何查询在SQL server本身上执行此操作。然后,数据永远不会以无掩码格式传输。另外,在查询中屏蔽CC信息的处理更少。@Swawn实际上在ColdFusion中屏蔽CC信息比稍后在SQL server中屏蔽CC信息要好。。。特别是由于1某些信息可能无法建立数据库并通过电子邮件立即发送,2您可以在访问数据库服务器之前对其进行清理,3确保只有信用卡号被屏蔽,而不是像Instagram或GooglePlus URL参数这样的cc值。@Francom我在下面分享了我的解决方案,并在生产中使用它。我还添加了一个链接,以便您可以使用CFTry.com进行试验。不同的信用卡公司使用不同的格式,请参见。这只适用于非常特殊的情况。如果这个正则表达式失败(在很多情况下都会失败),信用卡号将以纯文本显示。在我看来,用正则表达式来掩盖信用卡号不是一个好主意。我只是在代码层面上回答老年退休金计划的问题。一般来说,我同意混淆抄送号码是个坏主意,但我尽量不要对更广泛的目标做出假设。事实上,我想屏蔽textarea字段中的所有16位数字。我们目前有一个支持页面,客户可以在其中输入评论。他们中的一些人正在输入他们的整个卡号,我想在它被附加到表中之前屏蔽它。谢谢。@Francom我的答案将掩盖所有长度介于8-19之间的抄送号码的最后4位数字。此范围匹配所有可能的CC编号长度。我将在我的答案中添加一个更新以屏蔽所有数字。嗨,查尔斯。我希望整个文本区域字段或字符串位于一个变量中。所以所有的东西都在一个变量中。示例:str将为您提供相同的字符串,但带有掩码编号。谢谢。我将网站表单提交存储到数据库中。任何PCI敏感数据在记录数据之前都会被屏蔽。我们最近买了一辆奥迪 编辑数据并使用正则表达式扫描可能已在注释字段中提交的信用卡。我们发现许多Instagram和GooglePlus URL参数与信用卡正则表达式匹配。仅确定了一个值,但存在许多误报。小结:不要盲目地删除数据库中的正则表达式匹配项,除非它实际上是一张信用卡,否则最终可能会破坏重要的非CC数据。
<cfset str="Her card no. is 1234567890123456  which is a bogus number.">
<cfset num=listGetAt(str,5,' ')>
<cfset card=right(num,4)>
<cfset card=listInsertAt(card,1,'************')>
<cfset card=listChangeDelims(card,'')>
<cfset card=replaceList(str,num,card)>
<cfdump var="#card#" />
<cfscript>
function maskCC(textFragment){
    var response = Javacast("string", arguments.textFragment);
    var temp = {};
    temp.TestCCs = reMatch("\b(?:\d[ -]*?){13,16}\b", response);
    if (arrayLen(temp.TestCCs)){
        for (temp.thisCC in temp.TestCCs) {
            temp.cleanNum = reReplace(temp.thisCC,"[^[:digit:]]","","all");
            if( isValid("creditcard", Temp.cleanNum )){
                response = Replace(response, temp.thisCC, "************" & Right(Temp.cleanNum,4), "all");
            }
        }
    }
    return response;
}
</cfscript>

<CFOUTPUT>
<pre>
#maskCC('4444 3333 2222 1111')# (with spaces)
#maskCC('4444-3333-2222-1111')# (with dashes)
#maskCC('4444333322221111')# (no separators)
#maskCC('1234567890123456')# (not a CC)

GENERIC TEXT FROM TEXTAREA FORM FIELD:
#maskCC('Here is my unsecure CCNum: 4444333322221111.
My transaction ID IS: 4567123498765283. Please refund.')#
</pre>
</CFOUTPUT>