Payment processing gateway 是否应验证账单地址?
结论
并非所有支付网关都会默认强制验证账单地址。通常,支付网关会将地址信息提交给发卡行的 Address Verification Service(AVS),收到匹配结果后,再由商户的风控规则决定放行、拒绝或转人工审核。
因此,仅凭“地址填成 Address 仍然支付成功”,无法直接认定 FirstTrans 的验证机制有问题。可能的原因有:
- 商户没有启用 AVS。
- 网关返回了 AVS 不匹配结果,但系统没有因此拒绝交易。
- 发卡行、卡种或持卡人所在国家不支持 AVS。
- donation form 没有把账单地址正确传给网关。
- 当前交易规则只检查卡号、有效期和 CVV2,没有检查 AVS 结果。
不过,每隔 3 到 5 分钟更换卡号进行一笔 $1 donation,很符合“信用卡测试”(card testing)的特征。仅靠账单地址验证无法解决这类问题,还需要配合限速、行为检测、验证码和网关风控。
AVS 实际验证什么
AVS 通常比较账单地址中的数字部分,例如:
- 街道门牌号
- ZIP Code 或邮政编码
它通常不会逐字验证街道名称,也不能用来确认用户的真实居住地址。例如:
持卡人账单地址:123 Main Street, New York, NY 10001
用户提交地址:123 Anything, New York, NY 10001
某些 AVS 系统仍可能认为门牌号和邮编匹配。
AVS 返回的通常是结果码,而不是简单的 true 或 false。结果可能表示:
- 门牌号和邮编都匹配
- 只匹配门牌号
- 只匹配邮编
- 两者都不匹配
- 发卡行不支持 AVS
- 暂时无法验证
结果码及其含义由支付处理商决定,不能假设所有网关都使用同一套代码。
AVS 不匹配通常只是风险信号。除非商户在网关后台或服务端设置了相应的拒绝规则,否则交易仍有可能获得授权。
为什么银行仍可能批准交易
信用卡授权主要判断发卡行是否愿意批准这笔交易,并不意味着付款人已经通过完整的身份验证。
授权过程一般会参考以下信息:
- 卡号是否有效
- 有效期是否正确
- 卡片状态和可用额度
- CVV2 是否匹配
- 发卡行自身的反欺诈模型
- AVS 结果,前提是该交易支持并提交了地址
- 3-D Secure 验证结果,前提是已经启用
另外,“持卡人姓名已经过验证”这种说法也未必准确。许多银行卡授权网络不会严格匹配姓名,姓名字段可能只被记录或传递。应要求处理商明确说明哪些字段真正参与了授权,不能只接受“验证卡片上的信息”这种笼统说法。
$1 小额交易经常被用于测试盗取的卡号,因为攻击者只需要确认卡片能否正常授权。单笔金额低不代表风险低。大量失败或可疑授权还可能产生处理费、拒付、卡组织监控,甚至导致商户账户受到限制。
建议的排查步骤
1. 确认地址是否真的提交给支付网关
检查服务端创建交易时发出的请求,确认其中包含正确的 billing address 和 postal code。不要只看网页表单,因为前端收集了地址,不代表后端一定将其传给了网关。
还要确认:
- 地址没有被固定值覆盖。
- billing address 没有被误传成 shipping address。
- 邮编字段的格式符合网关要求。
- 生产环境与测试环境使用了相同的风控配置。
记录排查信息时必须脱敏,不要在日志中保存完整卡号或 CVV2。
2. 获取 AVS 和 CVV 的原始响应
请 FirstTrans 或实际支付处理商提供以下信息:
- 是否支持 AVS
- 支持哪些国家、卡种和发卡行
- 如何启用 AVS
- AVS 结果码的官方含义
- AVS 不匹配时是否默认拒绝
- 是否可以配置商户级拒绝规则
- CVV2 不匹配、未处理和不支持分别如何表示
同时要分清支付链路中的各个角色。donation form、支付网关、收单机构和发卡银行可能由不同公司提供,AVS 结果也可能在其中某一层被忽略。
3. 制定 AVS 风控规则
可以采用以下初始策略:
- 门牌号和邮编均不匹配:拒绝或转人工审核。
- 仅部分匹配:结合金额、国家、设备和历史行为判断。
- 发卡行不支持 AVS:不要全部拒绝,但应提高风险评分。
- CVV2 明确不匹配:通常应拒绝。
- AVS 完全匹配:仍不能直接认定交易安全。
非营利组织可能会收到国际捐款,而部分国家和发卡行无法使用 AVS。如果直接拒绝所有“无法验证”的交易,可能会误伤正常捐赠者。
4. 阻断信用卡测试行为
针对当前的攻击模式,应优先采取以下措施:
- 按 IP 地址限制提交频率。
- 按会话、设备、邮箱和支付指纹限制尝试次数。
- 拦截短时间内使用多个卡号的行为。
- 在服务端加入 CAPTCHA 或 Turnstile 验证。
- 提高固定小额金额和重复金额的风险评分。
- 提高数据中心代理、匿名网络和明显异常地区的风险评分。
- 启用网关提供的 velocity rules、bot protection 或 card testing protection。
- 对连续失败的客户端设置逐步增加的冷却时间。
- 不向前端返回过于详细的失败原因。
只按 IP 限速通常不够,因为攻击者可能轮换代理地址。限速规则应同时参考多个维度。
服务端风控示例
下面是一个不依赖具体支付厂商的示意代码。字段名称需要替换成实际网关 SDK 返回的字段,不能直接假定 FirstTrans 使用相同接口。
function evaluatePaymentRisk({
avsResult,
cvvResult,
attemptsByIp,
distinctCardsBySession,
captchaVerified
}) {
if (!captchaVerified) {
return { action: "reject", reason: "captcha_failed" };
}
if (cvvResult === "mismatch") {
return { action: "reject", reason: "cvv_mismatch" };
}
if (avsResult === "street_and_postal_mismatch") {
return { action: "reject", reason: "avs_mismatch" };
}
if (attemptsByIp > 5 || distinctCardsBySession > 3) {
return { action: "reject", reason: "velocity_limit" };
}
if (
avsResult === "partial_match" ||
avsResult === "unsupported" ||
avsResult === "unavailable"
) {
return { action: "review", reason: "avs_inconclusive" };
}
return { action: "allow", reason: "risk_checks_passed" };
}
限速应在创建支付请求之前执行,以免攻击流量已经进入支付网关并触发授权请求:
app.post("/donations", async (req, res) => {
const key = `${req.ip}:${req.session.id}`;
const rate = await rateLimiter.consume(key);
if (!rate.allowed) {
return res.status(429).json({
error: "Unable to process this donation."
});
}
if (!await verifyCaptcha(req.body.captchaToken)) {
return res.status(400).json({
error: "Unable to process this donation."
});
}
// 使用网关提供的 token,而不是在本机服务中保存原始卡号或 CVV2。
const paymentResult = await gateway.authorize({
amount: req.body.amount,
paymentToken: req.body.paymentToken,
billingAddress: req.body.billingAddress
});
const decision = evaluatePaymentRisk({
avsResult: normalizeAvsResult(paymentResult.avsResult),
cvvResult: normalizeCvvResult(paymentResult.cvvResult),
attemptsByIp: rate.attempts,
distinctCardsBySession: rate.distinctPaymentMethods,
captchaVerified: true
});
if (decision.action !== "allow") {
if (paymentResult.authorizationId) {
await gateway.voidAuthorization(paymentResult.authorizationId);
}
return res.status(400).json({
error: "Unable to process this donation."
});
}
return res.status(200).json({ status: "accepted" });
});
如果业务采用先授权后捕获模式,风控判断应在捕获资金之前完成。能否安全撤销授权、撤销时限以及是否会产生费用,都要以处理商的接口和合同为准。
注意事项
AVS 只能降低风险,不能证明付款人就是持卡人。攻击者可能同时掌握账单地址,正常用户也可能因为搬家、地址缩写、使用国际卡或发卡行数据问题而匹配失败。
还需要注意:
- 不要存储 CVV2。
- 尽量使用网关托管字段或 tokenization,减少服务器接触卡数据的范围。
- 日志中只保留脱敏后的卡号信息,例如最后四位。
- 不要向攻击者返回“CVV 正确但地址错误”之类的精确提示。
- CAPTCHA 必须由服务端验证,不能只依赖前端结果。
- 发现攻击后,应联系处理商的风险团队,要求启用 card testing 防护,并检查近期授权记录。
- 对已经批准的可疑交易,应根据交易状态和处理商建议决定是否 void、refund 或上报。退款与撤销授权的成本和效果并不相同。
地址不匹配却没有触发自动拒绝,在支付系统中可能只是配置方式所致。但明显的信用卡测试持续通过,说明当前风控并不理想。需要确认 AVS 信息是否已经提交、读取并用于决策,同时部署多维限速和机器人防护,不能把安全性全部寄托在一个地址字段上。
备注:内容仅供参考。
