2015-10-09 49 views
1

在我的網站上,我有一個結賬頁面,一旦客戶輸入了他們的卡片詳細信息,他們只需點擊「立即付款」。它不是一個PayPal按鈕。任何人都可以更改數量值<input>?

我確認訂單後才收取費用,只需點擊一下即可接受訂單。

我的問題是:他們可以簡單地改變輸入標籤,並將值設置爲0不付錢?

請看看這個:

<input type="hidden" id="total-cost-val" value="3.85"> 
<input name="/atg/commerce/order/purchase/CommitOrderFormHandler.commitOrder" value="Pay now" class="place-order" type="submit">  
<input name="_D:/atg/commerce/order/purchase/CommitOrderFormHandler.commitOrder" value=" " type="hidden"> 
<input name="/atg/commerce/order/purchase/CommitOrderFormHandler.formName" value="paymentForm" type="hidden"> 
<input name="_D:/atg/commerce/order/purchase/CommitOrderFormHandler.formName" value=" " type="hidden"> 
<input name="/atg/commerce/order/purchase/CommitOrderFormHandler.commitOrderSuccessURL" value="" type="hidden"> 
<input name="_D:/atg/commerce/order/purchase/CommitOrderFormHandler.commitOrderSuccessURL" value=" " type="hidden"> 
<input name="/atg/commerce/order/purchase/CommitOrderFormHandler.commitOrderErrorURL" value="" type="hidden"> 
<input name="_D:/atg/commerce/order/purchase/CommitOrderFormHandler.commitOrderErrorURL" value=" " type="hidden"> 
<input id="jsEnableCheck" name="/atg/commerce/order/purchase/CommitOrderFormHandler.jsCheckForCheckout" value="true" type="hidden"> 
<input name="_D:/atg/commerce/order/purchase/CommitOrderFormHandler.jsCheckForCheckout" value=" " type="hidden"> 

這是我很擔心的第一行 - 我不是一個程序員,我沒有做這個,我只是從谷歌Chrome瀏覽器的複製「檢查元素的功能。

他們可以使用'編輯爲HTML'將value = "3.85"更改爲value = 0嗎?

如果這樣做的話?

+2

是的每一個都可以 –

+0

它實際上工作嗎? –

+1

你是什麼意思?如前所述,可以使用新值編輯該框並將其發送到您的服務器。不要將價格等任何數據放入隱藏字段中。你最好把物品的ID和加載價格從DB –

回答

2

作爲一般規則,客戶端計算機上運行的任何內容都可能被客戶端攻擊 - 特別是HTML。

有一兩件事你可以做,而不是將是,在服務器上,創建該交易中的GUID(或一些其它標識符),並有其他輸入:

<input type="hidden" id="transaction-id" value="127819A3-C0FB-404F-BFF8-D4FA2C4240EA"/> 

然後保存關閉服務器上的信息,所以如果他們修改了這個值,那麼他們很難將它變成一個有效的交易,所以他們會被卡住的真實金額。

旁註:如果那是XHTML,你需要在標籤末尾的斜線:<tag />

+0

正如你所說,它是非常unlikley,但它仍然是。 –

+0

不太可能,因爲兩次匹配的機率爲0.00000037%。 – iAdjunct

1

是的,這是可能的。一般來說,當有人在修改結構後發送帖子,或者甚至不使用結構時,都需要隨時準備好。

這就是爲什麼一個確認應該有3個層次:

  • 客戶端驗證:本應在瀏覽器中的JavaScript代碼運行,並應防止無效形式通過確保浪費資源提交只有有效的請求被髮送到服務器
  • 應用程序端驗證:應該在服務器端運行,應該做的事情與客戶端驗證差不多,因此您可以防止將無效請求發送到您的服務器之外黑客形式
  • 深度驗證:這個級別應該達到if和只有當請求通過兩個先前的級別,在這裏你應該運行數據庫。支票

因此,客戶端驗證可以防止服務器打擾用戶發送的無效請求。應用程序端可以防止服務器對明顯的黑客攻擊嘗試進行深入分析。深度分析是驗證的最後一步。如果一個請求值得達到這個級別,甚至通過它,那麼請求是正確的。

1

可以在發送表單之前更改表單值,是的。

爲了防止它,只要你的服務器上查詢有關交易您頒佈之前 - 確認金額是否正確,以及你收集任何其他細節,只有履行訂單,當你有明確的,可信的手頭確認付款是通過您使用的任何服務完成的。

如果金額與您對服務/產品的預期不匹配,或者付款未通過,只需向用戶返回適當的錯誤以及接下來要執行的操作說明等。

0

他們可以使用'Edit as HTML'將'value =「3.85」'更改爲value = 0嗎?

是的,我可以(我通常使用螢火蟲做類似的事情來知道我保存的密碼,通過改變輸入類型從'密碼' - >'文本')。

如果這樣做的話?

是的,它的工作原理。因爲當我提交表單時,它只會檢查當前輸入的值。它將它視爲從內存位置獲取價值。


所以, 從不相信我(客戶端)。如果可能,我甚至可以通過Facebook提交Google表單。

1

他們可以簡單地更改輸入標記並將值設置爲0來支付 什麼都沒有?

是的,訪問者可以更改HTML或發送POST/GET請求到表單處理程序,並修改信息。

一般來說,來自客戶的信息應視爲不可信的。應該有始終是服務器端驗證

由於您沒有自己編寫程序,您可能需要嘗試欺騙信息並檢查是否存在服務器端驗證。如果沒有,你應該聘請一個新的程序員。

相關問題