2010-03-28 58 views
7

如何在PHP頁面之間安全地傳遞信用卡信息?我建立一個電子商務應用程序,我想有用戶要經過結帳這樣的:如何在PHP頁面之間安全地傳遞信用卡信息

輸入信息 - >查看 - >最終確定訂單

問題是,我不知道如何安全地從用戶輸入它們到我處理它時(在最終訂購步驟中)傳遞信用信息。我聽說使用會話是不安全的,即使使用加密。

任何幫助,將不勝感激!

+1

這僅僅是一個壞主意。你不得不面對沒有真正利益的增加的風險。支付網關無論如何都可以確認信用卡號碼,會話數據可以被攻擊並且在屏幕上呈現CC號碼可能意味着它們被緩存在某處。 – Rimian 2010-03-28 06:02:27

+0

將確認和付款信息結合在同一頁面上。 – 2010-06-25 23:12:22

回答

1

那麼,首先你應該使用HTTPS協議來確保連接是加密的。

之後,您可以將數據存儲在超全局的$_SESSION中。數據存儲在您的服務器上,因此它相對安全。

你可以做一個類似的技術,將信息插入訂單數據庫,其中的關鍵是一個GUID或其他相當隨機和獨特的東西。然後,當人進入修改/審查它們的順序,你應該有訂單ID存儲在URL中的GET部分(或者,如果你是偏執狂,一個cookie /會話變量):

https://example.com/order?orderID=akjgflkhaslasdfkjhalsdjkljahs 

要提供額外的安全性,您還可以在訂單表中存儲IP地址,並確保IP和訂單ID匹配。

+0

我儘量不存放如果可能的話 – Alex 2010-03-28 03:23:26

+2

@Alex確認頁面從服務器請求我的服務器上的信息。你還有什麼地方要存放它?客戶端? – Rimian 2010-03-28 05:59:25

+8

這是違反PCI-DSS的原因,$ _SESSION會以純文本格式將數據寫入硬盤。 – rook 2010-03-28 18:04:56

0

不是我的專業領域,但我想你想將它存儲在一個會話中,但也可以使用「同步令牌」(或近來的孩子們稱之爲)來幫助避免CSRF攻擊。

當然,想要使用HTTPS(正確)是,避免在URL和隱藏字段的敏感數據,避免將非常敏感的信息在什麼反應,等等等等

10

我不會」隨時隨地存儲。這太冒險了,可能不合乎道德。

通過在https上發佈表單並僅存儲交易結果向支付網關發送請求。

您可能只關心交易是否被批准或拒絕。誰在乎數字是什麼?

+0

我傾向於同意在這裏提出的觀點,如果您試圖不存儲卡信息(這不是一個壞主意),那麼無論您用於處理付款信息提交表單的PHP腳本都應該轉發關於支付網關的信息或任何需要去的地方。這意味着信用卡信息必須是您在結帳過程中要求的最後一件事。 – 2010-03-28 05:06:40

+1

+1,它通常審查命令_before_進入CC信息。這裏的商業邏輯只是倒退。 – 2010-03-28 06:17:56

+2

事實上,很多網站(包括amazon,newegg)在輸入您的信息後都會有一個評論/確認頁面,以確保您輸入正確的運費/結算信息 – Alex 2010-03-28 14:04:05

8

不要將信用卡信息存儲在會話中,不要將其存儲到數據庫中,也不要將其存儲到文件中。相反,將cc信息寫回隱藏的html輸入中的評論頁面。

所以程序流會的工作是這樣的:通過HTML表單

  1. 用戶帖子的支付和結算信息發送給服務器。
  2. 服務器驗證此信息的格式是否正確(例如,信用卡具有適當的數字位數,已輸入帳單地址等)
  3. 驗證後,服務器回寫提交爲隱藏表單的所有信息輸入字段。這包括帳單地址,送貨地址和信用卡信息。
  4. 評論頁面上的表單(帶有隱藏的輸入字段)有一個標有「完成順序」/「完成順序」的按鈕。此評論將帖子形式發送到最終訂單腳本。
  5. 的最終化腳本存儲在數據庫中的計費/航運信息並提交信用卡信息到您的支付網關。

這種方法的優點有兩方面:

  1. 節省存儲信用卡信息時需要額外的PCI合規的開銷和成本。
  2. 此方法停留在SSL協議的安全邊界內。這意味着,在任何情況下都必須將加密的信用卡信息提交給您的服務器 - 這種方法將繼續僅依賴於SSL的功效,而不會引入持續存在的信用卡數據的複雜性。

這最後一點引發了另一個問題 - 通過審查頁面,加倍信用卡數據在網絡上傳輸的次數加倍。使用這種方法,最少有4個傳輸:客戶端到服務器,服務器到客戶端,客戶端到服務器(再次),然後服務器到網關。沒有審查,最少有2次傳輸:客戶端到服務器和服務器到網關。評論頁面的便利性是否值得額外傳輸?這是您作爲Web開發人員(和您的客戶)所做出的決定。

+0

我在想,但是在我將它們寫回隱藏表單輸入字段之前,我應該在信用卡信息上進行某種服務器端加密嗎?如果是這樣,我應該如何處理這種方法? Digtally簽名? – Alex 2010-03-28 14:07:54

+2

使用此方法,您不會將cc信息存儲在服務器的任何位置,因此您可以依靠SSL加密將cc數據傳輸到服務器或從服務器傳輸。 – leepowers 2010-03-28 23:28:43

+0

我很好奇,如果在隱藏表單輸入中的cc信息在技術上可以被瀏覽器緩存並存儲在用戶硬盤上的臨時緩存文件中。無論如何,以防止這一點?也許應該生成一個隨機密鑰並將其存儲在會話中,然後使用該密鑰加密隱藏表單字段中的cc信息。一旦發佈了評論頁面,就可以使用會話密鑰對該值進行解密並將其傳遞給信用卡處理器... – stereoscott 2011-06-17 20:15:06

0

我想我會同意。存儲信用卡號碼風險太大,其後果可能牽強附會。

理想的方式是將信息傳遞給第三方處理器,只是使用將結果返回給你塑造腳本邏輯。

if (transaction){ 
    // code goes here 
} 
else{ 
    // code goes here 
} 

希望你明白了吧... :)

1

一種選擇是使用像Authorize.net's Customer Information Manager付款資料,服務(還有其他的也行)。您可以通過API將支付信息存儲在配置文件中,然後在實際充電時使用配置文件ID。這樣你就不會將數據存儲在你的服務器上。