PayPal JavaScript SDK - 了解客户端的安全问题
PayPal JavaScript SDK - understand security problems on the client-side
我最近在我的 Angular 11 项目 (implementation reference) 中实施了 PayPal JavaScript SDK。它似乎完美无缺地工作,但是,我开始认为可以在客户端修改定价金额。此外,如果支付金额确实与请求金额相符,PayPal 方面似乎没有进一步验证。
paypal.Buttons({
style: {
layout: 'vertical',
color: 'gold',
shape: 'pill',
label: 'paypal'
},
createOrder: (data, actions) => {
console.log(data);
return actions.order.create({
purchase_units: [
{
reference_id: this.id,
description: this.description,
amount: {
currency_code: 'EUR',
value: this.pricing
}
}
]
});
},
onApprove: (data, actions) => {
console.log(data);
return actions.order.capture();
},
onError: error => {
console.error(error);
},
onCancel: error => {
console.error(error);
}
}).render(this.paypalElement.nativeElement);
因此,我开始研究客户端安全性,尤其是 PayPal SDK。在此过程中,我在 Whosebug 上发现了几篇有趣的帖子,例如:
- PayPal express checkout security with silent ajax call
- How can I secure transactions made with client-side PayPal Smart Checkout buttons?
总体共识几乎是:“你是对的,它不安全,你需要在后端执行此操作。”
然而,虽然我现在意识到这似乎不是一个安全的长期解决方案,但上述帖子中的 none 答案提供了一些关于攻击者如何实际修改客户端的额外信息-端代码。我在修改客户端 JavaScript 代码方面相当缺乏经验,所以我非常希望能够理解该过程并了解我必须在多大程度上保护我的应用程序。
how attackers would practically modify the client-side code. I´m fairly inexperienced when it comes to modifying client-side JavaScript code, so I would really appreciate to understand the process and learn to what degree I have to secure my application.
调试器检查点和从浏览器开发工具调试器或控制台修改变量是一种显而易见的方法,对于了解所有主要浏览器附带的普通工具的人来说。
如果你不这样做,修改客户端 JS 最直接的方法是下载 JS 文件或 HTML-with-JS 文档,进行任何你想要的更改,然后提供你的替代品使用像 Resource Override 这样的扩展名,然后再次执行流程。
在实用性的另一端,客户端可以是用任何语言从头开始编写的自定义浏览器可执行文件,带有自己的或修改后的 JavaScript 解释器。或者只是一个开源浏览器,如 Firefox 或 Chromium,修改然后编译。
本质上,客户端有可能发送、接收和执行它(因此,攻击者)想要的任何命令。它完全不安全,您的服务器必须验证您想要验证的一切。不是一些东西,是所有东西。
因此,始终假设客户端_可能_是 100% 的恶意行为者,并且绝对不要相信任何东西,仅仅因为它据称来自“您自己的”客户端代码。
我最近在我的 Angular 11 项目 (implementation reference) 中实施了 PayPal JavaScript SDK。它似乎完美无缺地工作,但是,我开始认为可以在客户端修改定价金额。此外,如果支付金额确实与请求金额相符,PayPal 方面似乎没有进一步验证。
paypal.Buttons({
style: {
layout: 'vertical',
color: 'gold',
shape: 'pill',
label: 'paypal'
},
createOrder: (data, actions) => {
console.log(data);
return actions.order.create({
purchase_units: [
{
reference_id: this.id,
description: this.description,
amount: {
currency_code: 'EUR',
value: this.pricing
}
}
]
});
},
onApprove: (data, actions) => {
console.log(data);
return actions.order.capture();
},
onError: error => {
console.error(error);
},
onCancel: error => {
console.error(error);
}
}).render(this.paypalElement.nativeElement);
因此,我开始研究客户端安全性,尤其是 PayPal SDK。在此过程中,我在 Whosebug 上发现了几篇有趣的帖子,例如:
- PayPal express checkout security with silent ajax call
- How can I secure transactions made with client-side PayPal Smart Checkout buttons?
总体共识几乎是:“你是对的,它不安全,你需要在后端执行此操作。”
然而,虽然我现在意识到这似乎不是一个安全的长期解决方案,但上述帖子中的 none 答案提供了一些关于攻击者如何实际修改客户端的额外信息-端代码。我在修改客户端 JavaScript 代码方面相当缺乏经验,所以我非常希望能够理解该过程并了解我必须在多大程度上保护我的应用程序。
how attackers would practically modify the client-side code. I´m fairly inexperienced when it comes to modifying client-side JavaScript code, so I would really appreciate to understand the process and learn to what degree I have to secure my application.
调试器检查点和从浏览器开发工具调试器或控制台修改变量是一种显而易见的方法,对于了解所有主要浏览器附带的普通工具的人来说。
如果你不这样做,修改客户端 JS 最直接的方法是下载 JS 文件或 HTML-with-JS 文档,进行任何你想要的更改,然后提供你的替代品使用像 Resource Override 这样的扩展名,然后再次执行流程。
在实用性的另一端,客户端可以是用任何语言从头开始编写的自定义浏览器可执行文件,带有自己的或修改后的 JavaScript 解释器。或者只是一个开源浏览器,如 Firefox 或 Chromium,修改然后编译。
本质上,客户端有可能发送、接收和执行它(因此,攻击者)想要的任何命令。它完全不安全,您的服务器必须验证您想要验证的一切。不是一些东西,是所有东西。
因此,始终假设客户端_可能_是 100% 的恶意行为者,并且绝对不要相信任何东西,仅仅因为它据称来自“您自己的”客户端代码。