通常,支付 API 分为 3 类:
- 支付页面托管在商家端并提交给商家
- 支付页面托管在商家端,只有卡数据提交给支付提供商(通常通过 JavaScript SDK)
- 支付页面托管在支付提供商端并提交给支付提供商,商户在授权成功后收到通知
假设支付提供商没有搞砸大事,您应该完全超出选项 2 和 3 的 PCI DSS 范围。
使用选项 2,您不在 PCI DSS 范围内,您从不使用信用卡数据,而是e4baf901-252b-4818-b826-7f89cad884db
由支付处理器的 JavaScript SDK 分配给交易的永久或临时令牌(如 )。除此之外,3ds 工作流程与选项 1 完全相同,只是您的 API 请求具有属性pan_token
而不是pan
属性。以 Braintree 上的托管字段 API 为例https://developers.braintreepayments.com/start/hello-client/javascript/v3
使用选项 3,您不在 PCI DSS 范围内,您实际上什么也不做,您只需将您的客户重定向到支付提供商或在 iframe 或其他东西中打开支付提供商的页面,这是这种 API 的一个示例:https ://ipgtest.webteh.hr/en/documentation/form
使用选项 1
那是另一回事,是的,您在 PCI DSS 范围内,是的,您需要有一个有效的证书,具体取决于执行 PEN 测试的地区,有一个安全的组织和所有其他“坏东西”、密码策略、跳转主机以进行连接,安全的(最好是分段的)网络,确保日志不显示任何内容,“拒绝所有”网络配置,每年进行审计等等等等。
如果你走这条路(我真的不明白为什么你应该,拜托,不要)至少你可以避免拥有 HSM 并担心加密密钥等 - 这意味着你不应该将 PCI DSS 数据存储到硬盘驾驶。
通常,避免这种情况的最简单解决方案是将信用卡数据存储在 memcache 中,过期策略为 1 小时或更短(我到目前为止所做的所有实现都需要 15 分钟)。诀窍是不要把它写在磁盘上(这就是为什么在大多数实现中不是 redis 的原因),但是像 memcache 这样的内存存储是公平的游戏。只需确保访问密钥是大而安全的,例如 uuid (ie e4baf901-252b-4818-b826-7f89cad884db
)。
在实践中并不总是这样......
从历史上看,支付公司对商家 PCI DSS 合规性一直非常松懈,“数据库中充满 PAN”和“没有 PAN 接触过系统”之间的唯一实际区别是“您的自我评估问卷有多少问题”(PCI DSS商户的 SAQ)。
只有在非常特殊的情况下,当商家被确定为被盗卡的常见销售点时,商家才被迫、非常非常不情愿地并且在信用卡公司有很多“理解”的情况下接受 PCI DSS lvl2/lvl1 合规性审计。
然而,由于一系列违规行为,这种情况正在发生变化,至少在某些地区(如 SEE Europe),支付公司现在坚持从选项 1 迁移到所有没有完整 PCI DSS 合规证书的商家(不仅仅是 SAQ 问卷中的“X”标记练习)。