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

Posted

技术标签:

【中文标题】如何在 PHP 中的页面之间安全地传递信用卡信息【英文标题】:How to securely pass credit card information between pages in PHP 【发布时间】:2011-02-01 16:05:43 【问题描述】:

?我正在构建一个电子商务应用程序,我想让用户像这样完成结帐:

输入信息 -> 审核 -> 完成订单

问题是我不确定如何安全地从用户输入信用信息到我处理信用信息(在完成订单步骤)。我听说使用会话是不安全的,即使使用加密也是如此。

任何帮助将不胜感激!

【问题讨论】:

这只是个坏主意。你必须处理增加的风险而没有真正的好处。支付网关无论如何都可以确认信用卡号码,会话数据容易受到攻击,并且在屏幕上呈现 CC 号码可能意味着它们被缓存在某个地方。 在同一页面上合并确认和付款信息。 【参考方案1】:

嗯,首先你应该使用 HTTPS 协议来确保连接是加密的。

之后,您可以将数据存储在$_SESSION 超级全局中。数据存储在您的服务器上,因此相对安全。

您可以执行类似的技术,将信息插入订单数据库,其中的键是 GUID 或其他相当随机且唯一的东西。然后,当该人去修改/查看他们的订单时,您应该将订单 ID 存储在 URL 的 GET 部分(或者如果您偏执,一个 cookie/会话变量):

 https://example.com/order?orderID=akjgflkhaslasdfkjhalsdjkljahs

为了提供额外的安全性,您还可以在订单表中存储一个 IP 地址,并确保 IP 和订单 ID 匹配。

【讨论】:

如果可能,我会尽量不在我的服务器上存储信息 @Alex 从服务器请求确认页面。你还要把它存放在哪里?客户端? 这违反了 PCI-DSS,因为 $_SESSION 会将数据以纯文本形式写入硬盘。【参考方案2】:

不是我的专业领域,但我认为您希望将其存储在会话中,但还需要使用“同步令牌”(或现在孩子们所说的任何东西)来帮助避免 CSRF 攻击。

当然,您希望使用 https(正确),避免 URL 和隐藏字段中的敏感数据,完全避免在任何响应中放置非常敏感的信息,等等,等等。

【讨论】:

【参考方案3】:

我不会将它存储在任何地方。这风险太大,可能不符合道德。

通过 https 发布表单向支付网关发送请求,并仅存储交易结果。

您可能只关心交易是被批准还是被拒绝。谁在乎号码是多少?

【讨论】:

我倾向于同意这里提出的观点,如果您不想存储卡信息(这不是一个坏主意),无论您使用什么 php 脚本来处理付款信息提交表应该只是将信息转发到支付网关或任何需要去的地方。这意味着信用卡信息必须是您在结帐过程中要求的最后一件事。 +1 ,在输入抄送信息之前查看订单是很常见的。这里的业务逻辑只是倒退。 实际上,许多网站(包括亚马逊、新蛋)在您输入信息后都会有一个审核/确认页面,以确保您输入正确的运输/账单信息 @alex 没错!账单和运输信息已确认,但交易详情未确认。亚马逊会根据记忆显示抄送的最后 4 位数字。【参考方案4】:

不要将信用卡信息存储在会话中,不要将其存储到数据库中,也不要将其存储到文件中。相反,将 cc 信息写回到隐藏的 html 输入中的评论页面。

所以程序流程会这样工作:

    用户通过 html 表单将付款和账单信息发布到服务器。 服务器验证此信息的格式是否正确(即信用卡有适当的位数、输入的帐单地址等) 验证后,服务器将所有提交的信息作为隐藏表单输入字段写回。这包括帐单地址、送货地址和信用卡信息。 评论页面上的表单(带有隐藏的输入字段)有一个标记为“完成订单”/“完成订单”的按钮。此审核表发布到最终定单脚本。 finalize 脚本将帐单/运输信息存储在您的数据库中,并将信用卡信息提交到您的支付网关。

这种方法的优点有两个:

    您可以节省存储信用信息时所需的额外 PCI 合规性的开销和成本。 此方法保持在 SSL 协议的安全范围内。这意味着,在任何情况下都必须将加密的信用卡信息提交到您的服务器——这种方法继续完全依赖 SSL 的功效,而不会引入持久化信用卡数据的复杂性。

最后一点引发了另一个问题 - 通过使用评论页面,您可以将加密信用卡数据通过网络传输的次数增加一倍。使用这种方法,最少有 4 次传输:客户端到服务器、服务器到客户端、客户端到服务器(再次)然后服务器到网关。未经审查,至少有 2 次传输:客户端到服务器和服务器到网关。评论页面的便利值得额外传输的风险吗?这是您作为 Web 开发人员(和您的客户)必须做出的决定。

【讨论】:

我是这么想的,但是在我将信用卡信息写回作为隐藏表单输入字段之前,我是否应该对信用卡信息进行某种服务器端加密?如果是这样,我应该如何处理这种方法?数字签名? 使用这种方法,您不会将 cc 信息存储在服务器上的任何位置,因此您将能够依靠 SSL 加密将 cc 数据传输到服务器或从服务器传输。 我很好奇在隐藏表单输入中的 cc 信息是否可以在技术上被浏览器缓存并存储在用户硬盘上的临时缓存文件中。无论如何要防止这种情况?也许应该生成一个随机密钥并将其存储在会话中,然后使用该密钥加密隐藏表单字段中的 cc 信息。发布评论页面后,可以使用会话密钥解密该值并将其传递给信用卡处理器... 您可以控制浏览器如何缓存返回数据,以防止隐藏字段被写入磁盘。请参阅此处的“示例 #2 缓存指令”:php.net/manual/en/function.header.php【参考方案5】:

我想我必须同意。存储信用卡号码的风险太大,后果可能很牵强。

理想的方法是将信息传递给第三方处理器,然后使用返回的结果来塑造您的脚本逻辑。

if (transaction)
     // code goes here

else
     // code goes here

希望你明白这一点... :)

【讨论】:

【参考方案6】:

另一种选择是使用Authorize.net's Customer Information Manager 之类的付款资料服务(还有其他)。您通过他们的 API 将付款信息存储在配置文件中,然后在实际向卡收费时使用配置文件 ID。这样您就永远不会将数据存储在您的服务器上。

【讨论】:

以上是关于如何在 PHP 中的页面之间安全地传递信用卡信息的主要内容,如果未能解决你的问题,请参考以下文章

如何在php脚本之间传递变量?

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

如何在 Xamarin 表单中的视图模型之间最好地传递信息 - Prism [关闭]

使用 Paypal Rest API 的直接卡支付时如何安全地获取客户的信用卡

贝宝集成后端?

我如果把微信同时登录在iPad上,能不能用iPad扫码微信支付?