支付方式能选中,点击按钮没有反应,Console 出现 Refused to load/execute ... because it violates Content Security Policy。CSP 阻止的可能是脚本、iframe、API 连接、图片或内联代码;把整个策略改成 * 会失去防护。
先读取完整 violation
记录 directive(script-src、frame-src、connect-src 等)、blocked URI、页面与支付步骤。第三方 SDK 脚本能加载,不代表它创建的 iframe 和 API 域也被允许。测试模式与生产模式域名通常不同。
白名单按资源类型最小放行
在自定义模块的 CSP whitelist 中添加支付提供商官方要求的精确 host 与类型,区分 https、子域和 WebSocket。不要凭错误逐个允许未知追踪域;先核对支付商文档和实际调用用途。
内联脚本与 nonce/hash
自定义模板把大段初始化代码直接写在 script 标签里,严格策略会阻止。优先移到 RequireJS/静态模块并通过 data config 传参数;需要内联时使用 Magento 当前版本支持的 secure renderer/nonce/hash 机制,而不是 unsafe-inline。
Report-only 与 Enforce
升级时可先在报告模式收集 violation,再在测试环境启用 enforce。报告端点要限制数据和流量,violation 可能包含页面 URL。不要长期只 report 而从不收敛规则。
支付回归不能只到按钮
验证 SDK 加载、3DS iframe、tokenization、确认 API、成功/失败回跳和 Webhook。还要检查 CSP 放行没有让任意第三方脚本进入结账。最终 Console 无意外 violation,真实测试交易完成,敏感支付数据仍只进入合规组件。
第三方域名会动态变化
支付商可能按地区、3DS 提供商或风控服务加载不同子域。白名单应基于官方集成清单并定期复核,不能看到 Console 域名就直接允许。通配符范围越大,供应链脚本被攻破时影响越大。
Checkout CSP 与后台不同
CSP mode 可以按 area/route 有不同配置。只在开发首页测试不够,要从实际 checkout action、成功/失败页验证。多网站使用不同支付商时,白名单模块也应按启用范围加载,避免所有站点共享不必要来源。
报告去重
浏览器会为同一阻止产生大量 report。按 directive、blocked host、source file 和版本聚合,设置采样与告警阈值。部署新增 violation 应阻止发布;已确认的浏览器扩展噪声则单独过滤。
Report-Only 不是可以长期忽略
Report-Only 适合上线前收集真实资源,但如果长期只报告,策略并没有保护作用。为观察期设置结束日期,清理 nonce/hash/host 清单后再转 enforce。紧急回滚应只回滚新增规则或支付发布,不要永久改成允许所有 inline/eval。
支付完成页也要验证
第三方脚本可能在下单按钮阶段正常,却在 3DS 返回、vault 保存或 success 页面被拦截。覆盖 iframe、redirect、弹窗、失败重试和保存卡片场景,并在浏览器隐私模式测试。最终以网关交易与 Magento 订单状态一致为准。

