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);
最终检查步骤
- 用浏览器工具确认所有应用页面返回正确的
Content-Security-Policy头 - 用Shopify Webhook测试工具验证POST请求的HMAC逻辑是否正常
- 确保应用所有入口(OAuth回调、Webhook、主页)都实现了完整的HMAC验证
内容的提问来源于stack exchange,提问作者Repon Hossain
相关产品推荐
相关产品推荐

