金流的安全問題


#1

小弟目前在form表單裡面加上隱藏欄位
然後裡面是帶金錢,但是用開發者工具就能被改價錢
請問有什麼辦法可以解決這個問題?


#2

把金錢的資訊留在 server,結案(?


#3

但是有個問題是我如果在controller用RestClient送post…我的頁面就不會導到付款的頁面
只能用form表單然後指向金流的頁面才可以導到付款頁面 T_T


#4

… 你可以記在 user 的 session 內,或是預先開單,跟著單號走,很多方法都可以達到一樣的目的哩


#5

所以你是要送到金流的?
金流商應該有要求你一併送 checksum 出去才對,金流商會去比對 checksum 來檢查這些資料是不是被篡改過

如果金流沒有這個功能的話……你還是換一間吧


#6

JC大大可以給我一個範例嗎?

我還是不太了解
如果我是寫這樣
controller
@price = session[:price]

view
hidden_field_tag 'price', @price
然後前端顯示是這樣
<input id="price" name="price" type="hidden" value="500" />

表單的action是這樣
<form method="post" action="https://xxxx.payment">
然後使用者點下送出form表單,表單就送到金流廠商那裡去了
但是透過開發者工具一樣可以改價錢


#7

okay,我知道你說的是哪段的問題了,是出口端到金流商的,不過首先問一下你用哪間第三方支付?

因為第三方支付應該都可以用類似 checksum 的方式來做包含金額的 check,就可以不被修改之類的,類似

checksum = md5(shop_id,order_id,amount,title,total_price,private_key)

所以要問哪間金流之類的,and 你有把 checksum 實作完成了嗎?(不過其實我知道有幾間沒做 checksum 或是 checksum 沒包含金額之類的 … 甚至還有到金流商後還可以改金額的)

再來就是真的都無法,然後一定要這樣幹,你有幾個方式可以優化這部分,類似 post 段其實是空白或 loading 頁面(還可以做廣告呦,類似轉轉轉寫『安全交易中』),直接 call javascript 自動幫你送 post (非 ajax),類似

<html>
  <head>
    <script src="/js/jquery.js"/>
    <script>
      jQuery(function($){
        $('form').submit();
      })
    </script>
  </head>
  <body>
    <form action="TARGET_URL" method="post">
      <input type='hidden' name='FIELD' value='VALUE'>
    </form>
  </body>
</html>

很簡單的動作(基本上這頁越乾淨越好,速度越快),也就是

(原始) 使用者訂單送出 => 金流商
(修改) 使用者訂單送出 => Rails建立上面的轉頁 => 金流商

這樣有機敏資訊的頁面在使用者手上的時間就比較少,你的資訊可以多一層攔截,當然這沒辦法完全防止破解

最後的,金流商 callback 時,如果金額不正確,一率改為錯誤單然後人工額外處理(可以的話也注記錯誤原因),這是很基本的商業邏輯:『不要相信外部資訊,不管是誰,資訊一進來一定重新驗算』,即使有 checksum 的金流系統也都是哩

所以以上,如果對方系統無法修正,且真的可能有人改金額,且無法有任何改進的方式時,就只能列錯誤單然後人工處理就是(當然你可以裝傻不處理把錢吃下來?),大概就這樣而已唄