通过多步骤表格传递信用卡号的最安全方法?

Posted

技术标签:

【中文标题】通过多步骤表格传递信用卡号的最安全方法?【英文标题】:Safest way to pass credit card number through a multi-step form? 【发布时间】:2011-01-17 15:20:18 【问题描述】:

在第 3 步我有一个接受信用卡的表格,第 4 步重新打印包括信用卡最后 4 位数字在内的信息,第 5 步我需要知道完整的 CC# 才能处理并发送通过我与第 3 方供应商的 https 连接 - 我应该通过隐藏输入或 $_SESSION 存储它,以便我可以在第 3 步和第 5 步之间访问它?

仅供参考:我的整个网站已经 https 了。

【问题讨论】:

【参考方案1】:

将信用卡号作为最后一步,这样您就不必存储它。存储这些信息存在许多法律问题。

【讨论】:

嗯,问题是客户已经决定对表单步骤进行排序,这真的很麻烦,而且我可能无法影响他们这样做。跨度> 您可以使用 Braintree 保留此工作流程。第三步,您可以将信用卡存储在 Braintree 信用卡保险库中。 Braintree 会给您一个令牌,您以后可以用它来向信用卡收费。您可以在第 4 步中检索被屏蔽的信用卡号,以将其显示给用户以进行确认。然后要对信用卡收费,在第 5 步中使用第 3 步中的令牌进行 API 调用。Braintree 可以消除您环境中信用卡数据的存储和传输。 getbraintree.com 披露:我为 Braineree 工作。【参考方案2】:

SSL 不会保护存储在磁盘上的数据。此外,php 会话数据默认存储在文件系统中的临时目录下,具有最小权限。因此,数据不仅以纯文本形式存储,而且可以被许多不同的系统用户访问(取决于您的 Web 服务器配置)。

如果您想实现多步骤结帐流程,我建议您在浏览器端做一些 AJAX/javascript 魔术。您可以使用一系列隐藏/折叠的 DIV 收集计费信息,并一次性发布完整的数据集,将 CC 数据一次性发送到您的服务器,然后将 CC 数据中继到您的支付处理器。

【讨论】:

但是如果 JS 被禁用,你将如何支持严格的服务器端处理? 对于非 JavaScript 用户,您需要 1) 克里斯的回答所描述的解决方案或 2) 在隐藏字段中将带有 CC 信息的确认消息发送回用户。如果页面被浏览器或代理服务器缓存,第二个选项可能会导致问题。 如果你要让它完全 ajaxified,你能否详细说明你是否仍将 POST/SESSION 逻辑留在每个单独的步骤页面中? AJAX 在概念上与使用隐藏字段相同。【参考方案3】:

绝对不在隐藏的表单域中。如果用户离开或保存页面或有人点击后退按钮,则完整的 CC 信息可用。计算机可能与他人共享。

如果您确实将 CC 保存到磁盘/数据库,则必须对 CC 进行加密,否则您将违反支付卡行业 (PCI) 要求。为方便起见,您可以单独保留最后 4 位数字。

请注意,如果您使用会话(出于其他原因),您必须处理对会话的攻击,包括但不限于会话固定。

另一种可能性是重新设计您的客户端,以便各个步骤只是 ajax 调用(cc 在 js 变量中而不是在表单字段中)并使用 CSS 显示/隐藏各种 div - 在最后一步发布整个信息到您的服务器。

【讨论】:

使用隐藏 div 与使用隐藏字段有何不同?【参考方案4】:

根本不要存储它。那里有很多信用卡处理设施。除非您绝对必须在内部拥有此功能,否则不要这样做。

亚马逊支付服务:http://aws.amazon.com/fps/ BrainTree 支付解决方案:http://www.braintreepaymentsolutions.com/ 充值:http://chargify.com/ 贝宝:https://merchant.paypal.com/ Authorize.Net 经销商:http://www.authorize.net/solutions/merchantsolutions/resellerdirectory/

说真的,随便挑吧。

【讨论】:

无法存储怎么收费?我所说的存储是指通过页面,而不是在数据库或任何东西中。 你不收费。您将保护和收取卡的责任转交给为您执行此操作的服务。以上所有选项都可以将加密的数据发送到他们的站点进行处理。然后他们将收费结果返回到您的站点。 实际上我应该改写一下 - 我 am 将它传递给另一个服务,我没有用我自己的代码手动向 CC 收费,第 3 方供应商是,但是向第 3 方供应商提供 CC 的代码在第 5 步/最后一步,我在第 3 步输入 CC。 如果您的信用卡处理器提供像 Braintree 一样的信用卡保险库,您可以在第三步存储信用卡,但在第五步进行更改。披露:我为 Braintree 工作。【参考方案5】:

不管怎样。您应该(以某种方式)将其加密存储在服务器上。

【讨论】:

肯定不是 - SSL 只加密通道。它应该被加密存储,如果它甚至被存储的话,它可能不应该这样。 SSL 是不够的,它只能在数据从客户端移动到服务器时保护数据。一旦它在服务器上,您应该在存储它之前对其进行加密。您不希望 CC # 在内存或磁盘上以纯文本形式存在,黑客或流氓员工可以毫不费力地利用它们。

以上是关于通过多步骤表格传递信用卡号的最安全方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中的页面之间安全地传递信用卡信息

Javascript REGEX 在字符串和掩码中查找信用卡号

在 SQL Server 中屏蔽信用卡号

有没有更好的方法在 python 中屏蔽信用卡号?

防止重复使用信用卡的最佳方法

LUHN 信用卡验证在有效卡号上失败