ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

支付排障日志脱敏实战:别让一句 log.info 把卡号和 CVV 全交代了

支付排障日志脱敏实战:别让一句 log.info 把卡号和 CVV 全交代了 用户报告MPChat 卡付款没成功。值班工程师开始捞日志。然后他看到了最不想见的东西某个半年前赶工的模块里赫然写着log.info(request_body)。完整卡号、CVV、用户邮箱全部明文躺在那儿。更要命的是这条日志已经顺着链路流进了死信队列、APM 监控面板甚至挂在了客服工单的附件上下文里。正式链路大家都知道小心处理敏感字段。但排障环节往往是另一套逻辑——出了事先把信息捞全再说。信息是捞全了合规的底线也一起捞穿了。以下以 MPChat 卡片交易排障为业务场景讨论支付日志脱敏的通用设计落地。仅供架构说明不代表 MPChat 现网接口或内部实现。支付日志到底需要记录哪些字段工程师真的需要看完整请求体吗以 MPChat 的卡片交易为例第一轮排查通常只问这几件事什么时候发生的多少钱什么币种走的哪条渠道归一化状态是什么错误码是哪个以及一个能串联上下文但看不出原始交易号的追踪键。六样东西。没有一样需要 CVV没有一样需要完整卡号。按照 PCI DSS 合规要求和 OWASP 日志安全建议字段可以分三层处理层级处理方式典型字段可记录明文写入排障日志时间戳、金额、币种、归一化状态、受控错误码需变换HMAC 单向哈希后记录内部交易 ID → trace_key禁止记录不进入排障日志CVV、完整卡号PAN、验证码、完整请求体、用户邮箱容易踩坑的是那些看起来人畜无害的自由文本。商户显示名、报错描述随时可能夹带用户的邮箱或住址。把自由文本直接视为安全字段是一类很隐蔽的支付系统隐患。PCI 安全标准对这件事没有商量余地CVV 等敏感认证数据授权完成后不得留存。我加密保存了不构成保留理由。OWASP 的日志指引同样将令牌、卡片数据和个人标识划在红线之外。拿排查 bug 需要做挡箭牌在安全审计面前站不住脚。Python 实现白名单在生成侧不在展示侧很多团队的做法是先把全量数据存下来再依靠前端展示时打码。这个思路反了。打码是一层表皮数据库里躺着的还是明文。运维有权限死信有备份监控有快照。只要底层存了总有一天会被不该看到的人看到。更可靠的做法是在排障事件产生的那一刻就只放行白名单里的字段。以下是一段 Python 数据脱敏的参考实现pythonimport hashlib import hmac import re ALLOWED_STATUS {DECLINED, AUTHORIZED, SETTLED}ERROR_CODE re.compile(r^[A-Z0-9_]{1,40}$) def support_event(raw_event: dict, secret: bytes) - dict: 仅供架构说明不代表 MPChat 现网接口或内部实现。 secret 应由受控密钥系统提供与业务代码物理隔离。 status raw_event.get(status) code raw_event.get(error_code) if status not in ALLOWED_STATUS: raise ValueError(unsupported status) if not isinstance(code, str) or not ERROR_CODE.fullmatch(code): raise ValueError(invalid error code) internal_id str(raw_event[internal_transaction_id]) trace_key hmac.new( secret, internal_id.encode(utf-8), hashlib.sha256, ).hexdigest()[:24] return { trace_key: trace_key, occurred_at: raw_event[occurred_at], amount: raw_event[amount], currency: raw_event[currency], status: status, error_code: code, }看输出字典没有 cvv没有 pan没有 email没有 request_body也没有自由文本的错误描述。哪怕上游对象带着这些雷区字段过来输出这一层也不接收。trace_key只做内部哈希关联不当做可公开的流水号外传。密钥管理、访问控制、保留周期、导出审计需要另行设计不在这段代码的射程里。客服截图日志之外的敏感数据暗门后端日志做干净了客服系统大概率还在漏。MPChat 的用户提交一张报错截图经常连着收件地址、短信验证码和其它消费记录一起截了进来。这条数据入口很多团队的威胁建模里根本没有它的位置。处理截图的入水口要设三道关卡提交前——前端强提示用户自行裁剪与遮挡明确告知不收集 CVV 和验证码。数据进来之前拦成本最低。接收后——图片直接进受限存储桶设置独立权限与保留期限。绝不能混入通用日志池也不能被全文检索引擎爬到。查看时——客服按工单维度拉取必需材料访问与导出全程留审计痕迹。自动 OCR 识别可以做辅助预警但别承诺机器已经全部识别干净。检测失败的时候人工复核与硬删除的路径必须可用。承诺百分百识别率等于给自己埋了一份免责失效的隐患。卡片交易状态判读脱敏之后照样能排查最小暴露原则不是让工程师蒙着眼睛修 bug。排障系统里仍然要保留足以区分业务走向的信息。以 MPChat 卡片交易的三种典型状态为例掩码做到位工程师和客服依然能凭状态给出准确判断状态卡片侧含义不能直接推出的结论DECLINED商户未收到该笔付款≠ 系统故障需查具体拒绝原因AUTHORIZED资金处于挂账占用期≠ 交易完成不能催用户重新付款SETTLED底层资金已结算≠ 业务权益已发放订单侧需另行核对客服看到 SETTLED 就回复会员已开通看到 AUTHORIZED 就让用户重试——这两种操作在生产环境里都出过事故。状态和业务结论之间隔着一层跳过去就是误判。一份合格的排障材料底色是让工程师迅速查明异常同时让用户体面地保留自己的隐私。两件事不矛盾只是需要在系统设计的时候就想清楚而不是出了审计问题再补。
返回列表