2010-03-28 51 views
7

如何在PHP页面之间安全地传递信用卡信息?我建立一个电子商务应用程序,我想有用户要经过结帐这样的:如何在PHP页面之间安全地传递信用卡信息

输入信息 - >查看 - >最终确定订单

问题是,我不知道如何安全地从用户输入它们到我处理它时(在最终订购步骤中)传递信用信息。我听说使用会话是不安全的,即使使用加密。

任何帮助,将不胜感激!

+1

这仅仅是一个坏主意。你不得不面对没有真正利益的增加的风险。支付网关无论如何都可以确认信用卡号码,会话数据可以被攻击并且在屏幕上呈现CC号码可能意味着它们被缓存在某处。 – Rimian 2010-03-28 06:02:27

+0

将确认和付款信息结合在同一页面上。 – 2010-06-25 23:12:22

回答

1

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

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

你可以做一个类似的技术,将信息插入订单数据库,其中的关键是一个GUID或其他相当随机和独特的东西。然后,当人进入修改/审查它们的顺序,你应该有订单ID存储在URL中的GET部分(或者,如果你是偏执狂,一个cookie /会话变量):

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

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

+0

我尽量不存放如果可能的话 – Alex 2010-03-28 03:23:26

+2

@Alex确认页面从服务器请求我的服务器上的信息。你还有什么地方要存放它?客户端? – Rimian 2010-03-28 05:59:25

+8

这是违反PCI-DSS的原因,$ _SESSION会以纯文本格式将数据写入硬盘。 – rook 2010-03-28 18:04:56

0

不是我的专业领域,但我想你想将它存储在一个会话中,但也可以使用“同步令牌”(或近来的孩子们称之为)来帮助避免CSRF攻击。

当然,想要使用HTTPS(正确)是,避免在URL和隐藏字段的敏感数据,避免将非常敏感的信息在什么反应,等等等等

10

我不会”随时随地存储。这太冒险了,可能不合乎道德。

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

您可能只关心交易是否被批准或拒绝。谁在乎数字是什么?

+0

我倾向于同意在这里提出的观点,如果您试图不存储卡信息(这不是一个坏主意),那么无论您用于处理付款信息提交表单的PHP脚本都应该转发关于支付网关的信息或任何需要去的地方。这意味着信用卡信息必须是您在结帐过程中要求的最后一件事。 – 2010-03-28 05:06:40

+1

+1,它通常审查命令_before_进入CC信息。这里的商业逻辑只是倒退。 – 2010-03-28 06:17:56

+2

事实上,很多网站(包括amazon,newegg)在输入您的信息后都会有一个评论/确认页面,以确保您输入正确的运费/结算信息 – Alex 2010-03-28 14:04:05

8

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

所以程序流会的工作是这样的:通过HTML表单

  1. 用户帖子的支付和结算信息发送给服务器。
  2. 服务器验证此信息的格式是否正确(例如,信用卡具有适当的数字位数,已输入帐单地址等)
  3. 验证后,服务器回写提交为隐藏表单的所有信息输入字段。这包括帐单地址,送货地址和信用卡信息。
  4. 评论页面上的表单(带有隐藏的输入字段)有一个标有“完成顺序”/“完成顺序”的按钮。此评论将帖子形式发送到最终订单脚本。
  5. 的最终化脚本存储在数据库中的计费/航运信息并提交信用卡信息到您的支付网关。

这种方法的优点有两方面:

  1. 节省存储信用卡信息时需要额外的PCI合规的开销和成本。
  2. 此方法停留在SSL协议的安全边界内。这意味着,在任何情况下都必须将加密的信用卡信息提交给您的服务器 - 这种方法将继续仅依赖于SSL的功效,而不会引入持续存在的信用卡数据的复杂性。

这最后一点引发了另一个问题 - 通过审查页面,加倍信用卡数据在网络上传输的次数加倍。使用这种方法,最少有4个传输:客户端到服务器,服务器到客户端,客户端到服务器(再次),然后服务器到网关。没有审查,最少有2次传输:客户端到服务器和服务器到网关。评论页面的便利性是否值得额外传输?这是您作为Web开发人员(和您的客户)所做出的决定。

+0

我在想,但是在我将它们写回隐藏表单输入字段之前,我应该在信用卡信息上进行某种服务器端加密吗?如果是这样,我应该如何处理这种方法? Digtally签名? – Alex 2010-03-28 14:07:54

+2

使用此方法,您不会将cc信息存储在服务器的任何位置,因此您可以依靠SSL加密将cc数据传输到服务器或从服务器传输。 – leepowers 2010-03-28 23:28:43

+0

我很好奇,如果在隐藏表单输入中的cc信息在技术上可以被浏览器缓存并存储在用户硬盘上的临时缓存文件中。无论如何,以防止这一点?也许应该生成一个随机密钥并将其存储在会话中,然后使用该密钥加密隐藏表单字段中的cc信息。一旦发布了评论页面,就可以使用会话密钥对该值进行解密并将其传递给信用卡处理器... – stereoscott 2011-06-17 20:15:06

0

我想我会同意。存储信用卡号码风险太大,其后果可能牵强附会。

理想的方式是将信息传递给第三方处理器,只是使用将结果返回给你塑造脚本逻辑。

if (transaction){ 
    // code goes here 
} 
else{ 
    // code goes here 
} 

希望你明白了吧... :)

1

一种选择是使用像Authorize.net's Customer Information Manager付款资料,服务(还有其他的也行)。您可以通过API将支付信息存储在配置文件中,然后在实际充电时使用配置文件ID。这样你就不会将数据存储在你的服务器上。