问题描述
我最近在我的 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。在这个过程中,我发现了一些关于 stackoverflow 的有趣帖子,比如:
- PayPal express checkout security with silent ajax call
- How can I secure transactions made with client-side PayPal Smart Checkout buttons?
- Secure PayPal Checkout Client-side?
- PayPal Checkout: Is it safe to receive a payment with only client-side code?
总体共识几乎是:“您说得对,它不安全,您需要在后端执行此操作。”
然而,虽然我现在意识到这似乎不是一个安全的长期解决方案,但上述帖子中的任何答案都没有提供一些关于攻击者实际上如何修改客户端代码的额外信息。在修改客户端 JavaScript 代码方面,我相当缺乏经验,因此我非常希望了解该过程并了解我必须在多大程度上保护我的应用程序。
解决方法
攻击者实际上是如何修改客户端代码的。在修改客户端 JavaScript 代码方面,我相当缺乏经验,因此我非常希望了解该过程并了解我必须在多大程度上保护我的应用程序。
调试器检查点和从浏览器开发者工具调试器或控制台修改变量是一种显而易见的方法,对于熟悉所有主要浏览器附带的常规工具的人来说。
如果不这样做,修改客户端 JS 的最直接方法是下载 JS 文件或 HTML-with-JS 文档,进行任何您想要的更改,然后使用像 {{ 3}} 并再次通过流程。
在实用性的另一端,客户端可以是用任何语言从头开始编写的自定义浏览器可执行文件,带有自己的或修改过的 JavaScript 解释器。或者只是一个像 Firefox 或 Chromium 这样的开源浏览器,经过修改然后编译。
本质上,客户端有可能发送、接收和执行它(因此,攻击者)想要的任何命令。它是完全不安全的,您的服务器必须验证所有您想要验证的内容。不是某些事情,而是所有事情。
因此,始终假设客户端_可能_是 100% 的恶意行为者,并且绝对不信任,因为它据说来自“您自己的”客户端代码。