Paypal 快速结帐。在 onAuthorize 函数中将数据存储在 DB 中是不是安全?

Posted

技术标签:

【中文标题】Paypal 快速结帐。在 onAuthorize 函数中将数据存储在 DB 中是不是安全?【英文标题】:Paypal express checkout. Is it secure to store data in DB in the onAuthorize function?Paypal 快速结帐。在 onAuthorize 函数中将数据存储在 DB 中是否安全? 【发布时间】:2018-05-27 17:32:17 【问题描述】:

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

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

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

问题是 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 并确认向我的服务器进行虚假支付,这会将虚假数据插入数据库。

我认为解决此问题的唯一方法是首先(当用户单击“付款”按钮时)在数据库中创建“待处理”付款,然后在获得授权时使用数据调用我的服务器并检查 2 付款是否是一样的。

但是这个解决方案还有另一个问题,无法确保我的服务器实际执行了付款,攻击者可以执行第一个 POST 到我的服务器以创建付款,然后(即使在相同的函数中恢复“ID”) parsed_data['id']) 使用正确的 ID 执行第二个 POST;他可以在不通过贝宝窗口的情况下完成所有这些操作。

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

或者,我是否遗漏了 PaypalSDK 中的某些内容?有没有办法让 PAYPAL 在执行付款时调用我的服务器?

【问题讨论】:

我绝对可以在这里看到您的问题。没有什么可以阻止黑客改变价值观。也许是会话令牌,以便您知道对服务器的请求来自有效会话? @voidstate 我有一个想法,因为我认为在确认付款时,PayPal 会调用创建付款(服务器端,在旧问题中)中的“redirectUrl”参数,我可以插入一个带有一些 UrlEncoded 数据的 URL,让 PayPal 直接调用我的服务器,而不是让客户端负责调用它。每当我有客户端调用服务器时,都可能有人制作我的请求并利用此漏洞。你怎么看? @voidstate 好的,它不起作用...您建议如何为此数据流实现会话令牌? 【参考方案1】:

你是对的,客户端的没有什么是永远安全的。您应该让您的服务器验证付款是否成功(以及支付的金额是否正确等)。PayPal 具有用于服务器的 REST API 和用于特定语言的 SDK。

【讨论】:

以上是关于Paypal 快速结帐。在 onAuthorize 函数中将数据存储在 DB 中是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

Paypal 与快速结帐以获取 BillingAgreementID

PayPal 快速结帐在 MVC .net 中以 html 形式返回响应

Paypal 快速结帐的结帐屏幕不一致

Paypal 快速结帐剩余销售税

将总金额传递给 PayPal 快速结帐

Paypal 快速结帐集成安全问题