我们正在使用WorldPay处理分层会员系统的付款,其付款金额取决于所选的会员等级。
付款通过多个隐藏字段的表单发送到WorldPay,包括:
<input type="hidden" name="amount" value="295.00" />
基本上,表单通过POST提交给WorldPay,用户按照许多步骤处理他们的付款。完成后,用户将被重定向到指定的确认页面。
这似乎是WorldPay接受付款的典型方式。这里有一个明显的问题,因为任何具有HTML基础知识的人都很容易篡改隐藏字段的价值。该表单直接发布到WorldPay,因此我们没有PostBack来验证会员级别的金额。
我们可以选择通过在确认页面之前通过处理程序路由回调来从WorldPay向我们返回付款通知时验证付款金额;但是,我想避免用户提交被篡改的表格,支付不正确的金额并且没有收到会员资格的情况,然后必须联系公司以退还他们的钱。
在处理付款之前,我们如何验证提交的金额是否正确?
更新
我发现我们还有一个额外的问题,即使我们验证服务器端的表单,也没有什么可以阻止恶意用户将表单直接欺骗到WorldPay。
答案 0 :(得分:2)
确实是一个漏洞,可以使用签名轻松解决。看看这个链接:
http://culttt.com/2012/07/25/integrating-worldpay-into-a-database-driven-website/
应该在帮助页面上更好地宣传这种方法,太糟糕了。
答案 1 :(得分:-1)
我能想到的一个解决方案就是捕获form
标记的submit
:
<form id="myForm" onsubmit="return validatePayment();">
然后创建如下所示的 JavaScript文件:
var isValidAmount = false;
function validatePayment() {
if (isValidAmount) { return true; }
// in here you want to issue an AJAX call back to your server
// with the appropriate information ... I would recommend using
// jQuery and so it might look something like this:
$.ajax( {
type: "POST",
url: url,
data: { amount: $("#amount").val(), someotherfield: somevalue },
success: function(data, textStatus, jqXHR) {
// set the flag so that it can succeed the next time through
isValidAmount = true;
// resubmit the form ... it will reenter this function but leave
// immediately returning true so the submit will actually occur
$("myForm").submit();
},
});
// this will keep the form from actually submitting the first time
return false;
}