現在許多企業與組織都有網上賣東西的需求,而在線付款成為B2C的最大難題,因為銀行不能能直接與 那麼多企業(而且是中小企業)實施技術對接,幸好有類似支付寶這樣的中間件,這個問題才得以解決,但 是在付款給支付寶時,有一個“URL參數問題”,如果處理不當,就會給粗心的接口使用者造成損失。
這樣講的意思是:如果支付寶可以更加嚴謹的處理或B2C企業技術人員能夠嚴謹處理,這個損失是可以 避免的。
為了說明問題所在,先說一下支付寶接口在處理客戶付款時的流程:
1.顧客浏覽B2C網站並選擇產品,並點擊類似“支付寶支付”的按鈕--2.B2C網站後台程序處理,根據 顧客所選商品金額、訂單號等信息生成URL,跳轉至支付寶網站--3.支付寶網站根據URL參數生成付款數額 ,用戶在支付寶界面選擇網銀並支付給支付寶--4.支付寶收到銀行款項,將款項打入B2C企業的支付寶帳 戶,並主動訪問B2C網站的一個頁面,將付款結果以參數形式返回給該頁--5.該頁面接收到參數後,根據 URL MD5驗證與付款狀態成功字段,修改訂單狀態為“已付款”--6.B2C網站管理員看到“已付款”後發貨 。
問題出在步驟2與步驟5。
首先說說步驟2的具體環節:B2C網站按照支付寶接口的要求,將商品金額、訂單號碼等參數拼接為一 個URL,並將此URL參數的MD5值做為最後一個參數(應該是支付寶那邊做驗證用)傳遞給支付寶網站,支付 寶網站根據參數中的信息生成付款項。而URL中的所有參數都是明文傳遞的,雖然有MD5值做校驗,但無法 防止人為修改URL中的參數。攻擊者完全可以在下完訂單後,獲得此URL並修改訂單金額參數的值,並生成 新的MD5校驗值,而後拼接新的URL傳遞給支付寶,這樣一來,一張訂單的應付款項就被修改了。
再來說說步驟5:B2C網站的程序員在接收到反饋後,發現付款狀態為成功,就會更新整張訂單狀態為 “已付款”,而往往忽略了一個及其重要的事情,那就是檢測用戶付款數額!因為支付寶只保證某訂單是 否付款成功,而並不能保證付款數額為訂單額!(原因上面說的很清楚了)
解決方案:
支付寶公司改進方面:將URL參數以可逆密文形式傳遞,算法保密,不可對企業程序人員開放!
B2C企業方面:接收到支付寶反饋後,如果付款標志為“True”,先不要急於更新訂單狀態,要判斷一 下付款金額是否為訂單額,然後在處理