【问题标题】:Stripe - Fooling my server with a different subscriptionStripe - 用不同的订阅欺骗我的服务器
【发布时间】:2014-09-01 19:02:17
【问题描述】:

我已经在一个 Laravel 项目中实现了 Stripe。我对服务器端的 Stripe 的安全性和最佳实践有疑问。

例如,我为我的网站提供了三种订阅计划(比如说免费试用、基本和专业)。在 Stripe 验证用户的付款并向我发送交易令牌后,我将此令牌与用户选择的订阅一起发送到我的服务器,然后我在服务器上实际向用户收费。这个 sn-p 显示了执行这个过程的表单提交代码。

$('#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 的付款,但随后使用“专业”selectedPlan 值而不是“基本”值提交返回的令牌" selectedPlan 到我的服务器)。这将为用户提供已支付基本订阅费用的专业订阅。

这甚至可能吗?或者我是否已经从一个中立的怀疑论者变成了过度的偏执狂。

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

【问题讨论】:

  • 为了防止中间人攻击通过 https 发送您的数据。为防止重放攻击,请确保您的令牌生成功能强大且合理。

标签: php laravel-4 stripe-payments


【解决方案1】:

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

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

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

Stripe 并不关心他们通过 javascript 加密使用初始卡收到的美元金额值是多少 - 事实上,他们甚至可能不会发送/存储该信息。他们关心的是您通过 PHP API 发送的金额,即实际从卡中扣除的金额。

因此,如果您的用户在点击 basic 计划美元金额后提交了他们的卡信息,那么您的服务器由于他们的黑客行为以某种方式收到了一个 professional 变量,您可以放心,他们的卡仍然会根据在 professional 成本上,因为如果您的代码设置正确,您的 PHP 脚本将根据 professional 变量进行 Stripe_Charge。

您不需要 HTTPS 来正确/安全地执行此操作 - 老实说,您甚至不需要 CSRF 过滤器,因为只要您为特定计划收费,然后将该特定计划与 Auth:: user() 交易成功后(请务必将您的 Stripe_Charge 包装在适当的 Stripe_CardError try/catch 中),没有办法欺骗您。

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

【讨论】:

  • 感谢您提供如此完美的答案并花时间这样做。
  • @Deshawn 很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多