You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopify应用提交审核遭拒:安全头与请求验证问题求助

Shopify应用审核未通过:点击劫持防护与HMAC验证修复方案

一、点击劫持安全头设置错误

你当前的安全头配置完全阻断了Shopify后台嵌入应用的可能性,这是审核不通过的核心原因:

  • frame-ancestors 'none' 禁止所有域名通过iframe加载你的应用,但Shopify应用本身需要在https://*.myshopify.com域名的iframe中运行
  • X-Frame-Options: SAMEORIGIN 仅允许同域名嵌入,直接阻止了Shopify跨域名访问你的应用

修复代码

修改WordPress安全头设置,允许Shopify域名嵌入:

add_action('send_headers', [$this, 'send_headers']);

public function send_headers() {
    // 允许所有Shopify店铺域名嵌入应用
    header("Content-Security-Policy: frame-ancestors https://*.myshopify.com;");
    // 兼容旧浏览器,可保留X-Frame-Options(现代浏览器优先遵循CSP规则)
    header('X-Frame-Options: ALLOW-FROM https://*.myshopify.com');
}

额外检查:

  • 确认无其他WordPress安全插件覆盖你的头设置,可通过浏览器「网络」标签查看实际返回的响应头
  • 确保应用所有页面(包括OAuth回调、主页)都返回正确的安全头

二、HMAC验证的潜在问题

你的核心哈希逻辑没问题,但可能存在细节错误导致验证失败:

1. 参数处理不符合Shopify规则

Shopify的HMAC验证要求:

  • GET请求:排除hmac和signature参数,将剩余参数按字母顺序排序,用key=value&key=value格式拼接
  • POST请求(如Webhook):必须使用原始请求体(raw body)计算HMAC,不能解析后重新拼接

如果你的$data未按上述规则生成,会直接导致哈希结果错误。

2. Client Secret使用错误

确认使用的是Shopify应用后台的Client Secret(而非API Key),且未混淆开发/生产环境的密钥。

3. 字符编码问题

确保$data采用UTF-8编码,避免因编码差异导致哈希结果不一致。

修复示例(以OAuth回调GET请求为例)

// 获取所有GET参数
$params = $_GET;
// 移除hmac和signature参数
unset($params['hmac'], $params['signature']);
// 按字母顺序排序参数
ksort($params);
// 拼接成符合要求的字符串
$data = http_build_query($params);
// 计算并验证HMAC
$calculated_hmac = hash_hmac('sha256', $data, Auth::$client_secret);
$result = hash_equals($_GET['hmac'], $calculated_hmac);

最终检查步骤

  1. 用浏览器工具确认所有应用页面返回正确的Content-Security-Policy头
  2. 用Shopify Webhook测试工具验证POST请求的HMAC逻辑是否正常
  3. 确保应用所有入口(OAuth回调、Webhook、主页)都实现了完整的HMAC验证

内容的提问来源于stack exchange,提问作者Repon Hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:50:44