
关于
掌握 PCI DSS(支付卡行业数据安全标准)合规性,用于安全支付处理和持卡人数据管理。
name: pci-compliance description: "掌握 PCI DSS(支付卡行业数据安全标准)合规性,实现安全的支付处理和持卡人数据保护。" risk: unknown source: community date_added: "2026-02-27"
PCI 合规性
掌握 PCI DSS(支付卡行业数据安全标准)合规性,实现安全的支付处理和持卡人数据保护。
不要在以下情况使用此技能
- 任务与 PCI 合规性无关
- 你需要此范围之外的不同领域或工具
说明
- 明确目标、约束和所需输入。
- 应用相关最佳实践并验证结果。
- 提供可操作的步骤和验证方法。
- 如需详细示例,请打开
resources/implementation-playbook.md。
在以下情况使用此技能
- 构建支付处理系统
- 处理信用卡信息
- 实现安全支付流程
- 进行 PCI 合规性审计
- 缩小 PCI 合规性范围
- 实现令牌化和加密
- 准备 PCI DSS 评估
PCI DSS 要求(12 项核心要求)
构建和维护安全网络
- 安装和维护防火墙配置
- 不使用供应商提供的默认密码
保护持卡人数据
- 保护存储的持卡人数据
- 加密通过公共网络传输的持卡人数据
维护漏洞管理
- 保护系统免受恶意软件侵害
- 开发和维护安全的系统和应用程序
实施强访问控制
- 按业务需要限制对持卡人数据的访问
- 识别和验证对系统组件的访问
- 限制对持卡人数据的物理访问
监控和测试网络
- 跟踪和监控对网络资源和持卡人数据的所有访问
- 定期测试安全系统和流程
维护信息安全策略
- 维护涉及信息安全的策略
合规级别
级别 1:每年超过 600 万笔交易(需要年度 ROC) 级别 2:每年 100-600 万笔交易(年度 SAQ) 级别 3:每年 20,000-100 万笔电子商务交易 级别 4:每年少于 20,000 笔电子商务交易或少于 100 万笔总交易
数据最小化(绝不存储)
# NEVER STORE THESE
PROHIBITED_DATA = {
'full_track_data': 'Magnetic stripe data',
'cvv': 'Card verification code/value',
'pin': 'PIN or PIN block'
}
# CAN STORE (if encrypted)
ALLOWED_DATA = {
'pan': 'Primary Account Number (card number)',
'cardholder_name': 'Name on card',
'expiration_date': 'Card expiration',
'service_code': 'Service code'
}
class PaymentData:
"""Safe payment data handling."""
def __init__(self):
self.prohibited_fields = ['cvv', 'cvv2', 'cvc', 'pin']
def sanitize_log(self, data):
"""Remove sensitive data from logs."""
sanitized = data.copy()
# Mask PAN
if 'card_number' in sanitized:
card = sanitized['card_number']
sanitized['card_number'] = f"{card[:6]}{'*' * (len(card) - 10)}{card[-4:]}"
# Remove prohibited data
for field in self.prohibited_fields:
sanitized.pop(field, None)
return sanitized
def validate_no_prohibited_storage(self, data):
"""Ensure no prohibited data is being stored."""
for field in self.prohibited_fields:
if field in data:
raise SecurityError(f"Attempting to store prohibited field: {field}")
令牌化
使用支付处理器令牌
import stripe
class TokenizedPayment:
"""Handle payments using tokens (no card data on server)."""
@staticmethod
def create_payment_method_token(card_details):
"""Create token from card details (client-side only)."""
# THIS SHOULD ONLY BE DONE CLIENT-SIDE WITH STRIPE.JS
# NEVER send card details to your server
"""
// Frontend JavaScript
const stripe = Stripe('pk_...');
const {token, error} = await stripe.createToken({
card: {
number: '4242424242424242',
exp_month: 12,
exp_year: 2024,
cvc: '123'
}
});
// Send token.id to server (NOT card details)
"""
pass
@staticmethod
def charge_with_token(token_id, amount):
"""Charge using token (server-side)."""
# Your server only sees the token, never the card number
stripe.api_key = "sk_..."
charge = stripe.Charge.create(
amount=amount,
currency="usd",
source=token_id, # Token instead of card details
description="Payment"
)
return charge
@staticmethod
def store_payment_method(customer_id, payment_method_token):
"""Store payment method as token for future use."""
stripe.Customer.modify(
customer_id,
source=payment_method_token
)
兼容工具
Claude CodeCursor
标签
支付