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

时间:2014-07-11 08:03:55

标签: php laravel-4 stripe-payments

我已将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的付款,但随后使用&#34;专业&#34; selectedPlan 值而不是&#34;基本&#34; selectedPlan 到我的服务器)。这将为用户提供支付基本订阅的专业订阅。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

您不需要HTTPS来正确/安全地执行此操作 - 您实际上甚至不需要CSRF过滤器,因为只要您为特定计划收费然后将该特定计划与Auth ::相关联::成功事务后的user() (确保将Stripe_Charge包装在相应的Stripe_CardError try / catch中),没有办法欺骗你。

一个写得好的应用程序真正需要 CSRF过滤器的唯一地方是登录表单,只要我们服务器的所有其他输入我们检查Auth :: user()的权限。但是,当然,CSRF保护您应用中的每条可发布路线仍然是一个好主意,只是为了阻止带宽滥用。