2014-07-11 69 views
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變量。我想不出一個更好的方式來做到這一點(儘管我確信必須有),我擔心的是,(邪惡)用戶可能會攔截條紋標記並將其提交給我的服務器不同的selectedPlan價值(例如某人選擇基本訂閱,完成支付給Stripe,但隨後將返回的令牌用「專業」selectedPlan值而不是「基本」selectedPlan提交給我的服務器)。這會給用戶一個專業版訂閱付費的基本訂閱。

這甚至可能嗎?或者我是否已經從一箇中立的懷疑論者轉變爲瘋狂的過度偏執狂。

任何幫助或指導,非常感謝。

+2

防止中間人攻擊通過https發送您的數據。爲了防止重放攻擊,請確保您的令牌生成功能強大且合理。 – Halcyon

回答

3

這聽起來像你已經知道這一點,只需要保證,所以我可以提供。

使用Stripe,令牌 - 的確 - 僅僅意味着用戶的信用卡已被其服務器接收,正在等待/允許向您收費。

然後,您使用該令牌進行收費,在此情況下,基於selectedPlan變量。如果用戶在發送信用卡和收到代幣之間惡意更改該變量,那麼您仍然會根據變量進行收費,因此您仍然是黃金。

Stripe並不關心他們通過javascript加密獲得的最初卡的美元金額值 - 事實上,他們甚至可能不會發送/存儲該信息。他們關心的是您通過PHP API發送的美元金額,也就是實際向該卡收取的金額。

所以,如果用戶點擊一個basic計劃金額後提交他們的信用卡信息,然後以某種方式您的服務器接收到一個professional變量,由於其兩輪牛車,你可以放心,他們的卡仍然會基於該professional收費因爲如果代碼設置正確,您的PHP腳本將基於該變量professional變量Stripe_Charge。

您不需要HTTPS就可以正確/安全地執行此操作 - 實際上,您甚至不需要CSRF篩選器,因爲只要您針對特定計劃收費,然後將該特定計劃與Auth關聯: :用戶()成功事務(確保將您的Stripe_Charge包裝在適當的Stripe_CardError try/catch中)後,無法欺騙您。

真正需要一個精心編寫的應用程序需要 CSRF過濾器是在登錄表單上,只要所有其他輸入到我們的服務器我們檢查對Auth :: user()的許可。但是,當然,CSRF保護您應用程序中的每條貼子路線仍然是一個不錯的主意,目的只是爲了阻止帶寬佔用的濫用行爲。

+0

謝謝你提供這樣一個完美的答案,並花時間這樣做。 – dabarnard

+0

@Deshawn很高興幫助! – Leng