Shopify应用代理POST请求认证及数据库访问安全咨询
Shopify应用代理安全问题解答
1. 签名验证通过后直接访问数据库填充页面是否安全?
这个操作是安全的。Shopify的请求签名验证机制会确保所有到达代理端点的请求都是经过Shopify官方转发的,外部无法伪造符合签名要求的请求,未授权请求会被正确拦截返回401。
不过有两个细节需要注意:
- 数据库查询要严格绑定
shop参数(哪怕是单店铺自定义应用),避免后续扩展时出现数据混淆的风险 - 返回Liquid页面时,要对数据库返回的内容做必要的过滤(比如转义特殊字符),防止Liquid注入攻击
你的示例代码逻辑没问题,这里修正下语法错误:
app.get("/proxy_route/", async (req, res) => { if (verifyRequest(req, res)) { try { const rawCodeData = await QRCodesDB.list("<shop_name>.myshopify.com"); const response = await formatQrCodeResponse(req, res, rawCodeData); res.status(200).set("Content-type", "application/liquid").send(JSON.stringify(response)); } catch (error) { console.error(error); res.status(500).send(error.message); } } else { res.status(401).send("Not authorized"); } });
2. POST请求的客户会话验证与权限问题
仅传递{{ customer.id }}和{{ customer.email }}完全不安全,这两个值可以被客户端轻易篡改伪造,无法证明请求确实来自对应客户。
正确的验证方式:
- 利用Shopify代理的请求签名:所有经过Shopify代理转发的POST请求,同样会携带签名参数,后端要对POST请求执行和GET一样的签名验证,确保请求来自Shopify
- 验证客户会话有效性:在代理页面的Liquid中,可通过Shopify API提前生成并存储客户的会话令牌,渲染为
{{ customer.metafields.your_app.session_token }}传给前端;或者后端拿到请求中的shop参数和前端传递的customer.id后,用店铺的access token调用Shopify的Customer API,确认该客户存在且属于当前店铺 - 权限控制:删除操作时,必须在后端验证要删除的资源确实属于该
customer.id,不能仅依赖前端传递的参数
3. 代理页面表单提交报错与认证问题
- 421错误排查:先检查Shopify后台的应用代理配置,确认代理路径(比如
/apps/your-proxy/)和目标URL(你的ngrok地址)是否匹配,同时确保后端POST端点的路由配置正确 - 禁止直接提交到ngrok:表单的
action必须指向Shopify代理路径(比如/apps/your-proxy/post),不能直接写ngrok URL。只有经过Shopify代理转发的请求才会携带签名参数,后端才能通过签名验证 - POST端点的签名验证:你的
/proxy_route/post端点必须实现和GET端点一样的签名验证逻辑,否则会因为签名缺失或不匹配返回未授权错误
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

