Flutter集成Stripe:从设备发起HTTPS请求创建支付意图是否安全?
Flutter集成Stripe的客户端安全问题分析
核心结论
直接在Flutter客户端代码中使用Stripe Secret Key并发起请求的方案完全不安全,存在极高的风险,必须立即调整。
具体风险拆解
1. Stripe Secret Key极易泄露
- Flutter编译后的APK/IPA文件,即使开启了代码混淆,攻击者也可以通过静态反编译、内存dump工具(如Frida)或抓包分析(虽然HTTPS加密,但请求头中的
Authorization字段会携带密钥)轻松提取出你的Secret Key。 - 一旦Secret Key泄露,攻击者可以完全控制你的Stripe账户:创建任意金额的支付意图、发起退款、查询所有交易记录,甚至删除账户数据,造成不可挽回的损失。
2. 支付参数可被随意篡改
- 客户端的所有参数(包括
amount)都处于攻击者可控范围内:- 攻击者可以通过修改客户端内存中的变量值,把金额改成极低数值(比如1分钱)后发起支付;
- 即使通过HTTPS传输,若用户设备被植入恶意CA证书,攻击者可通过中间人攻击篡改请求体中的参数。
- 客户端侧的金额计算和参数传递完全不可信,无法保证支付金额的真实性。
解决方案:迁移至后端/边缘函数
你考虑迁移到Supabase边缘函数的方向是完全正确的,这是Stripe集成的标准安全流程:
- 客户端仅传递必要参数:向你的Supabase边缘函数发送请求,携带订单ID、描述等信息(不要直接传金额,后端从数据库中读取对应订单的真实金额)。
- 后端完成Stripe交互:在Supabase边缘函数中,使用Stripe Secret Key调用Stripe API创建Payment Intent,同时严格校验订单金额的合法性(比如确保金额与系统内订单一致,防止恶意参数)。
- 客户端用client_secret完成支付:边缘函数将Stripe返回的
client_secret传递给客户端,客户端使用Stripe的前端SDK(如flutter_stripe),通过client_secret完成支付流程。
这种方式下,Secret Key完全隐藏在后端,客户端无法接触到;所有金额校验逻辑在后端完成,攻击者无法篡改支付金额,从根源上解决了安全问题。
内容的提问来源于stack exchange,提问作者nilshv
相关产品推荐
相关产品推荐

