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