首页 文章

Stripe - 使用不同的订阅来欺骗我的服务器

提问于
浏览
1

我已经将Stripe实现到Laravel项目中 . 我在服务器端有一个关于Stripe的安全性和最佳实践的问题 .

例如,我有三个可用于我的网站的订阅计划(假设免费试用,基本和专业) . 在Stripe验证用户的付款并向我发送交易令牌后,我将此令牌与用户选择的订阅一起发送到我的服务器,然后我实际向用户收费 . 此代码段显示执行此过程的表单提交代码 .

$('#ButtonForBasicSubscription').click(function(){
  var token = function(res){
        var $token = $('<input type=hidden name=stripeToken />').val(res.id);
        var $plan = $('<input type=hidden name=selectedPlan />').val('basic');
        $('form').append($token,$plan).submit();
  };

  StripeCheckout.open({
    key:         'pk_my_publishable_key',
    address:     false,
    amount:      100,
    currency:    'gbp',
    name:        'My Product',
    description: 'Basic Subscription',
    panelLabel:  'Make Payment',
    token:       token
  });

在我的服务器上,然后我测试selectedPlan输入,然后根据该值,使用stripeToken向用户收费 .

我担心的是我发送selectedPlan变量的方式 . 我想不出更好的方法来做到这一点(虽然我肯定必须这样做),我担心的是(邪恶的)用户可能会拦截Stripe令牌并将其提交给我的服务器不同的selectedPlan值(例如某人选择基本订阅,完成对Stripe的付款,但随后将"professional" selectedPlan值而不是"basic" selectedPlan的返回标记提交给我的服务器) . 这将为用户提供支付基本订阅的专业订阅 .

这甚至可能吗?或者让我从一个中立的怀疑论者过渡到过度偏执狂 .

非常感谢任何帮助或指导 .

1 回答

  • 3

    听起来你已经知道这一点,只需要保证,所以我可以提供 .

    使用Stripe,一个令牌 - 实际上 - 仅仅意味着用户的信用卡已被他们的服务器接收并正在等待/允许您收取费用 .

    然后,您使用该令牌进行收费,在这种情况下,基于 selectedPlan 变量 . 如果用户在发送信用卡和您收到令牌之间恶意更改该变量,那么您仍然是金色的 .

    Stripe并不关心他们通过javascript加密使用初始卡获得的金额值是多少 - 实际上,他们甚至可能不会发送/存储该信息 . 他们关心的是您通过PHP API发送的金额,即实际向卡收取的金额 .

    因此,如果您的用户在点击 basic 计划金额后提交了他们的卡信息,那么您的服务器会因为他们的hackery而收到 professional 变量,您可以放心,他们的卡仍然会根据 professional 费用收取费用,因为您的PHP如果您的代码设置正确,脚本将基于该 professional 变量Stripe_Charge .

    您甚至不需要CSRF过滤器,因为只要您为特定计划收费,然后在成功交易后将该特定计划与Auth :: user()相关联(确保将Stripe_Charge包装在适当的位置) Stripe_CardError尝试/捕获),没有办法欺骗你 .

    一个写得很好的应用程序真正需要CSRF过滤器的唯一地方是登录表单,只要我们服务器的所有其他输入我们检查Auth :: user()的权限 . 但是,当然,它可以在您的应用程序上运行,以阻止带宽滥用 .

相关问题