3

WorldPay を使用して段階的なメンバーシップ システムの支払いを処理しています。支払い金額は、選択したメンバーシップの段階によって異なります。

支払いは、以下を含む多くの非表示フィールドからフォーム ポストを介して WorldPay に渡されます。

<input type="hidden" name="amount" value="295.00" />

基本的に、フォームは POST 経由で WorldPay に送信され、ユーザーはいくつかの手順に従って支払いを処理します。完了すると、ユーザーは指定された確認ページにリダイレクトされます。

これは、WorldPay が支払いを受け入れる典型的な方法のようです。ここには明らかな問題があります。非表示フィールドの値は、HTML の基本的な知識があれば誰でも簡単に改ざんできます。フォームは WorldPay に直接投稿されるため、メンバーシップ ティアに対して金額を検証するポストバックはありません。

確認ページの前にハンドラーを介してコールバックをルーティングすることにより、WorldPay から支払い通知が返されたときに支払い金額を検証するオプションがあります。ただし、ユーザーが改ざんされたフォームを送信し、間違った金額を支払い、メンバーシップを取得せず、会社に連絡して返金してもらう必要があるという状況は避けたいと思います。

支払いを処理する前に、提出された金額が正しいことをどのように検証できますか?

アップデート

サーバー側でフォーム ポストを検証しても、悪意のあるユーザーが WorldPay に直接フォーム ポストを偽装するのを止めることはできないという追加の問題があることがわかりました。

4

2 に答える 2

2

これは確かに脆弱性であり、署名を使用して簡単に解決できます。このリンクをチェックしてください:

http://culttt.com/2012/07/25/integrating-worldpay-into-a-database-driven-website/

このメソッドは、ヘルプ ページでより適切に宣伝する必要があります。残念です。

于 2013-03-27T19:17:55.033 に答える
-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;
}
于 2013-03-21T10:27:10.927 に答える