贝宝快速结帐。在 onAuthorize 函数中将数据存储在 DB 中是否安全?
Paypal express checkout. Is it secure to store data in DB in the onAuthorize function?
我在网站的支付流程中遇到了一个很大的安全问题。
我有一个 nodejs 服务器和一个带有 .js 的标准 html 页面,它使用 Paypal Express 结账。
鉴于我的网络应用程序的性质,我的服务器必须保存到期付款的数据。
关键是即使使用客户端-服务器架构来支付,数据流也是通过客户端浏览器。
问题是 Paypal Express 结账使用新的 window 来执行支付,所以数据必须通过客户端!
(也可能不是,等post结束)
这是我的客户端代码:
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 并向我的服务器确认虚假付款,这会将虚假数据插入数据库。
我认为解决此问题的唯一方法是首先(当用户单击 "payment" 按钮时)在数据库中创建一个 "pending" 付款,然后在授权时使用数据调用我的服务器并检查两次付款是否相同。
但是这个解决方案还有另一个问题,没有任何东西可以确保我的服务器实际执行支付,攻击者可以首先对我的服务器执行 POST 以创建支付,然后(即使在同一个函数中恢复 parsed_data['id'] 中的 "ID") 使用正确的 ID 执行第二个 POST;他可以在不通过 paypal 的情况下完成这一切 window.
我的问题是:有没有办法从我的服务器恢复与我的 Paypal 帐户相关的付款?
或者,我是否遗漏了 PaypalSDK 中的某些内容?有没有办法让 PAYPAL 在执行付款时调用我的服务器?
你是对的,客户端没有任何东西是安全的。您应该让您的 服务器 验证付款是否成功(以及正确的金额等)。PayPal 具有用于服务器的 REST API 和用于特定语言的 SDK。
我在网站的支付流程中遇到了一个很大的安全问题。
我有一个 nodejs 服务器和一个带有 .js 的标准 html 页面,它使用 Paypal Express 结账。
鉴于我的网络应用程序的性质,我的服务器必须保存到期付款的数据。 关键是即使使用客户端-服务器架构来支付,数据流也是通过客户端浏览器。
问题是 Paypal Express 结账使用新的 window 来执行支付,所以数据必须通过客户端! (也可能不是,等post结束)
这是我的客户端代码:
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 并向我的服务器确认虚假付款,这会将虚假数据插入数据库。
我认为解决此问题的唯一方法是首先(当用户单击 "payment" 按钮时)在数据库中创建一个 "pending" 付款,然后在授权时使用数据调用我的服务器并检查两次付款是否相同。
但是这个解决方案还有另一个问题,没有任何东西可以确保我的服务器实际执行支付,攻击者可以首先对我的服务器执行 POST 以创建支付,然后(即使在同一个函数中恢复 parsed_data['id'] 中的 "ID") 使用正确的 ID 执行第二个 POST;他可以在不通过 paypal 的情况下完成这一切 window.
我的问题是:有没有办法从我的服务器恢复与我的 Paypal 帐户相关的付款?
或者,我是否遗漏了 PaypalSDK 中的某些内容?有没有办法让 PAYPAL 在执行付款时调用我的服务器?
你是对的,客户端没有任何东西是安全的。您应该让您的 服务器 验证付款是否成功(以及正确的金额等)。PayPal 具有用于服务器的 REST API 和用于特定语言的 SDK。