Paypal快递结账。在onAuthorize函数中将数据存储在DB中是否安全?

时间:2017-12-13 18:07:54

标签: javascript security paypal payment express-checkout

我在网站付款流程中遇到了很大的安全问题。

我有一个nodejs服务器和一个带有.js的标准html页面,它使用Paypal Express结帐。

鉴于我的webapp的性质,我的服务器必须保存付款的数据。 关键是即使使用客户端 - 服务器架构进行支付,数据流也会通过客户端浏览器。

问题是Paypal Express结帐使用新窗口执行付款,因此数据必须通过客户端传递! (或者可能不是,只是等待帖子的结尾)

这是我的客户端代码:



paypal.Button.render({

        env : 'sandbox',
        commit: true, 
        style: {
            size: 'medium',
            color: 'gold',
            shape: 'pill',
            label: 'checkout'
        },
        locale: 'en_US',
        payment: function() {
            nickname = $("#nickname").val();
            amount = $("#amount").val();
            description = $("#description").val();
            data = {
                "nickname" : nickname,
                "amount" : amount,
                "description" : description
            };
            return new paypal.Promise(function(resolve, reject) {
                jQuery.post("/newPayment", data).done(function(data){
                    console.log("HEI I GOT THE PAYMENT JSON = " + data);
                    parsed_data = JSON.parse(data);
                    resolve(parsed_data['id']);
                });
            });
        },

        onAuthorize: function(data, actions) {
            // HERE IS WHERE I SHOULD CALL MY SERVER TO INSERT DATA INTO DB
            console.log("PAYMENT SUCCESSFUL");
            return actions.payment.execute();
        },
        onError: function(data, actions){
            console.log("ERRORRRRRR");
            $("#warning").show();
        }

    }, '#paypal-button');




如果你查看我的注释行,就会出现BIIIG问题。 技术娴熟的人可以复制粘贴此.js并确认我的服务器的虚假付款,这会将错误数据插入数据库。

我认为解决此问题的唯一方法是首先(当用户点击"付款"按钮时)创建"待定"付款到DB,然后在授权时使用数据调用我的服务器并检查2付款是否相同。

但是这个解决方案还有另一个问题,没有什么可以确保我的服务器实际执行付款,攻击者可以执行第一次POST到我的服务器来创建付款,然后(即使在同一个函数中恢复" ID"在parsed_data [' id']中)使用正确的ID执行第二个POST;他可以在没有真正通过paypal窗口的情况下做到这一切。

我的问题是:有没有办法从我的服务器恢复与我的Paypal帐户相关的付款?

或者,我在PaypalSDK中遗漏了什么?有没有办法让PAYPAL在执行付款时调用我的服务器?

1 个答案:

答案 0 :(得分:1)

你是对的,客户端的没有是安全的。您应该让服务器验证付款是否成功(以及正确的金额等).PayPal既有服务器的REST API,也有特定语言的SDK。