关于 pci-dss-compliance
pci-dss-compliance 是面向商户和开发者的 PCI-DSS 合规指导技能,帮助根据支付数据流向判断评估范围,并介绍 Shopify、WooCommerce、BigCommerce 和自定义店面的控制措施。重点是通过托管结账和令牌化减少卡数据接触范围。
主要功能
- 01依据支付方式判断 SAQ 类型
- 02比较托管结账与自定义集成范围
- 03说明平台相关安全配置
- 04介绍令牌化与卡数据保护
- 05整理日志、访问控制和扫描要求
- 06提供审计准备检查项
适用场景
- 01确定信用卡业务的 PCI 范围
- 02选择适用的 SAQ 问卷
- 03降低系统接触持卡人数据的范围
- 04准备安全审计与合规评估
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill pci-dss-compliance安装后在 Claude Code 中输入/pci-dss-compliance确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
tile.jsonevals/pci-audit-logging-implementation/criteria.jsontask.mdevals/rbac-roles-and-password-policy/criteria.jsontask.mdevals/saq-type-selection-and-scope-reduction/criteria.jsontask.md详细介绍
PCI-DSS 合规性
概述
PCI-DSS(支付卡行业数据安全标准)适用于所有接受银行卡付款的商户。合规义务的范围和复杂程度,几乎完全取决于银行卡数据如何流经你的系统。使用托管支付表单(Shopify Payments、Stripe Checkout、PayPal hosted)的商户,可以选择最简单的评估(SAQ A,约 22 项控制要求)。运行自定义支付页面的商户,则面临最复杂的评估(SAQ D,约 330 项控制要求)。PCI 合规中最重要的一项决定是:选择能最大限度缩小合规范围的支付方式。
何时使用此技能
- 接受信用卡付款,需要确定 PCI 合规范围时
- 在 SAQ A、SAQ A-EP、SAQ D 或其他问卷类型之间进行选择时
- 实施令牌化以缩小 PCI 合规范围时
- 为做好 PCI 审计准备而设置日志记录、监控和告警基础设施时
- 准备 QSA(合格安全评估员)审计或填写 SAQ 时
核心说明
步骤 1:根据支付方式确定 PCI 合规范围
PCI 合规中最重要的决定,是银行卡数据如何流经你的环境:
| 集成方式 | SAQ 类型 | 控制要求约数 | 适用对象 |
|---|---|---|---|
| 完全托管的结账页面(Shopify Payments、Stripe Checkout、PayPal hosted) | SAQ A | ~22 | 银行卡数据不会接触你的服务器;客户会被重定向到支付处理商的支付页面 |
| 在你的页面上使用 JavaScript 令牌化(Stripe Elements、Braintree Drop-in) | SAQ A-EP | ~191 | 银行卡数据通过你页面上的 iframe 输入;你的服务器不会接触原始卡号 |
| 你的服务器会接触银行卡数据 | SAQ D | ~330 | 银行卡数据会经过你的应用服务器 |
建议:尽可能始终选择 SAQ A。 使用 Shopify Payments、Stripe Checkout 或 PayPal hosted 结账。将合规类型从 SAQ D 改为 SAQ A,可减少约 85% 的年度合规工作量。
步骤 2:针对特定平台进行 PCI 设置
Shopify
Shopify 是 PCI-DSS 一级服务提供商。使用 Shopify Payments 或通过 Shopify 结账接入任何支付网关时,Shopify 会负责支付处理环境的 PCI 合规。
作为 Shopify 商户,你的 PCI 合规范围:
- 使用 Shopify 托管的结账页面和 Shopify Payments:SAQ A — Shopify 会处理所有事项
- 你只需负责:确保 Shopify 管理后台的访问安全(强密码、2FA)、不在应用或电子表格中存储持卡人数据,以及审查第三方应用的安全性
在 Shopify 上完成 SAQ A:
- 从 PCI 安全标准委员会(pcisecuritystandards.org)下载 SAQ A
- Shopify 商户 PCI 合规文档位于 help.shopify.com/en/manual/payments/pci-compliance
- Shopify 会为其平台提供合规证明(AoC)——将其作为提交给收单机构的证明材料
你仍需负责的关键控制措施:
- 管理员账户安全:为所有 Shopify 员工账户启用 2FA(Settings → Users → require 2FA)
- 不在 Shopify 以外的任何位置存储卡号(不存入电子表格或第三方数据库)
- 审查已安装应用的数据安全实践
WooCommerce
WooCommerce 本身不符合 PCI 标准——是否合规取决于你的托管服务、支付网关和实现方式。
尽量缩小范围:使用托管式支付网关:
选项 A — Stripe Checkout(托管式重定向) → SAQ A
// Use WooCommerce Stripe Gateway in "Stripe Checkout" mode
// In WooCommerce → Settings → Payments → Stripe → Stripe Checkout: enable
// Customer is redirected to stripe.com for payment; SAQ A applies
选项 B — 在 WooCommerce 中使用 Stripe Elements → SAQ A-EP
- 官方 WooCommerce Stripe 插件默认使用 Stripe Elements
- 卡数据在 Stripe iframe 中采集;你的服务器只会收到支付令牌
- 这属于 SAQ A-EP(控制要求多于 SAQ A,但远少于 SAQ D)
SAQ A-EP 的 WooCommerce 托管要求: 你的网站托管服务必须满足 PCI 最低要求:
- SSL/TLS:确保托管服务提供商使用 TLS 1.2+,并配置最新的证书
- 修补:及时更新 WordPress、WooCommerce、插件和 PHP
- 托管服务:WP Engine、Nexcess 和 Kinsta 是具备 PCI 意识的托管服务商,并提供相关控制措施
- Wordfence:安装 Wordfence Security,用于恶意软件扫描和 WAF 防护(要求 5、6)
WooCommerce PCI 合规核查事项:
- WooCommerce 订单备注或自定义字段中未记录信用卡号
- WooCommerce 调试日志不会捕获支付数据(在生产环境中关闭调试日志)
- 所有管理员账号均使用强度高且唯一的密码,并启用 2FA
- 所有插件均在安全补丁发布后 30 天内更新
BigCommerce
BigCommerce 是通过 PCI-DSS Level 1 认证的平台。使用 BigCommerce 托管式结账和受支持的支付网关,即属于 SAQ A 范畴。
在 BigCommerce 上完成合规:
- BigCommerce 会为其平台基础设施提供 AoC
- 对于使用 BigCommerce Payments 或通过 BigCommerce 结账接入受支持支付网关的商家:适用 SAQ A
- 对于自定义支付集成或自定义结账页面:范围会扩大;请咨询 QSA
BigCommerce 关键设置:
- 前往 Store Settings → Security — 确保所有页面均强制使用 HTTPS
- 前往 Account Settings → Users — 确保所有管理员账号都有唯一 ID 和强密码
- 在账号安全设置中为管理员账号启用 2FA
- 检查已安装的应用 — 仅授予应用所需的最低权限
自定义 / 无头架构
对于自定义店面,PCI 范围取决于你集成支付处理的方式。使用 Stripe Elements 或 Braintree Drop-in UI,将范围控制在 SAQ A-EP 范畴内。
使用 Stripe Elements 实现 SAQ A-EP:
// Client-side: Stripe handles card data in an iframe — your code never sees card numbers
const stripe = await loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY!);
const elements = stripe.elements({ clientSecret });
const paymentElement = elements.create('payment');
paymentElement.mount('#payment-element');
// On submit — Stripe creates a PaymentMethod on their servers
const { error, paymentIntent } = await stripe.confirmPayment({
elements,
confirmParams: { return_url: `${window.location.origin}/order-confirmation` },
});
// Your server never receives a card number — only a paymentMethodId or paymentIntentId
SAQ A-EP 的关键控制措施(自定义店面):
# Requirement 4: TLS 1.2+ only, strong cipher suites
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
支付页面的内容安全策略(PCI-DSS v4.0 要求 6.4.3):
// Strict CSP on checkout pages — only authorized scripts allowed
const csp = [
`default-src 'self'`,
`script-src 'self' 'nonce-${nonce}' https://js.stripe.com`,
`frame-src https://js.stripe.com https://hooks.stripe.com`,
`connect-src 'self' https://api.stripe.com`,
`object-src 'none'`,
].join('; ');
response.headers.set('Content-Security-Policy', csp);
审计日志(要求 10):
// Log every authentication event, admin action, and access to payment data
interface AuditEntry {
timestamp: string;
userId: string;
userIp: string;
action: string;
resource: string;
outcome: 'success' | 'failure';
}
// Ship logs to an immutable store: CloudWatch Logs, Datadog, or S3 with Object Lock
// Requirement 10.7: Retain logs for 12 months; 3 months immediately available
PCI-DSS 控制措施清单:
| 要求 | 关键工程任务 |
|---|---|
| 要求 3:保护存储的数据 | 不存储原始卡号;仅使用 Stripe/Braintree 令牌 |
| 要求 4:加密传输 | TLS 1.2+;HSTS 标头;不得包含混合内容 |
| 要求 6:安全开发 | 在 CI 中进行依赖项扫描(npm audit、Snyk);SAST;清点支付页面上的脚本 |
| 要求 7–8:访问控制 | 基于角色的访问控制;唯一 ID;管理员启用 MFA;密码策略 |
| 要求 10:日志记录 | 记录所有身份验证事件、管理员操作和 CDE 访问,并包含用户 ID、时间戳和 IP |
| 要求 11:漏洞管理 | 由 ASV 每季度进行外部扫描;每年进行渗透测试 |
最佳实践
- 尽量缩小持卡人数据环境(CDE) — 使用托管支付表单以符合 SAQ A 要求,并将控制项从约 330 项减少到约 22 项;这是影响最大的 PCI 决策
- 绝不存储原始卡号 — 始终使用令牌化;如果你从未接触卡数据,大多数 PCI 要求就不适用于你的服务器
- 将日志发送到不可变存储 — 使用仅追加的日志目标(带 Object Lock 的 S3、CloudWatch Logs),以防攻击者篡改审计跟踪
- 强制所有管理员访问启用 MFA — PCI-DSS v4.0 要求 8.4.2 规定,所有访问 CDE 的操作都必须启用 MFA
- 自动执行漏洞扫描 — 在 CI/CD 中运行依赖项审计,并安排每季度进行 ASV 扫描;手动流程总是容易被遗漏
- 记录脚本清单 — PCI-DSS v4.0 要求 6.4.3 规定,必须记录支付页面上所有脚本的清单及其业务理由
常见问题
| 问题 | 解决方案 |
|---|---|
| 选择了 SAQ A,却使用 Stripe Elements | Stripe Elements(页面上的 JavaScript)属于 SAQ A-EP,而非 SAQ A;只有完全托管的重定向(Stripe Checkout)才符合 SAQ A 要求 |
| 生产环境启用了调试日志,导致支付数据被记录 | 在生产环境中禁用 WordPress/WooCommerce 调试日志;WC_DEBUG 和 WP_DEBUG 必须设为 false |
| 负载均衡器仍启用了 TLS 1.0/1.1 | 使用 nmap --script ssl-enum-ciphers -p 443 yourstore.com 验证;在负载均衡器和 CDN 上禁用 TLS 1.0/1.1 |
| 未将结账页面上的第三方脚本纳入清单 | PCI v4.0 要求提供书面清单;使用浏览器开发者工具进行审计;从支付页面移除非必要脚本 |
| 没有事件响应计划 | PCI 要求 12.10.1 规定,必须制定书面的 IR 计划并每年进行测试;即使从未发生过事件,也要制定一份基本计划 |
相关技能
- @secure-checkout
- @fraud-detection
- @account-security
- @financial-audit-trail