我已将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 到我的服务器)。这将为用户提供支付基本订阅的专业订阅。
这甚至可能吗?或者让我从一个中立的怀疑论者过渡到过度偏执狂。
非常感谢任何帮助或指导。
答案 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保护您应用中的每条可发布路线仍然是一个好主意,只是为了阻止带宽滥用。