我已经将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 回答
听起来你已经知道这一点,只需要保证,所以我可以提供 .
使用Stripe,一个令牌 - 实际上 - 仅仅意味着用户的信用卡已被他们的服务器接收并正在等待/允许您收取费用 .
然后,您使用该令牌进行收费,在这种情况下,基于
selectedPlan
变量 . 如果用户在发送信用卡和您收到令牌之间恶意更改该变量,那么您仍然是金色的 .Stripe并不关心他们通过javascript加密使用初始卡获得的金额值是多少 - 实际上,他们甚至可能不会发送/存储该信息 . 他们关心的是您通过PHP API发送的金额,即实际向卡收取的金额 .
因此,如果您的用户在点击
basic
计划金额后提交了他们的卡信息,那么您的服务器会因为他们的hackery而收到professional
变量,您可以放心,他们的卡仍然会根据professional
费用收取费用,因为您的PHP如果您的代码设置正确,脚本将基于该professional
变量Stripe_Charge .您甚至不需要CSRF过滤器,因为只要您为特定计划收费,然后在成功交易后将该特定计划与Auth :: user()相关联(确保将Stripe_Charge包装在适当的位置) Stripe_CardError尝试/捕获),没有办法欺骗你 .
一个写得很好的应用程序真正需要CSRF过滤器的唯一地方是登录表单,只要我们服务器的所有其他输入我们检查Auth :: user()的权限 . 但是,当然,它可以在您的应用程序上运行,以阻止带宽滥用 .