PayPal JavaScript SDK - понимание проблем безопасности на стороне клиента

Недавно я внедрил PayPal JavaScript SDK в свой проект Angular 11 (ссылка на реализацию). Кажется, что это работает безупречно, однако я начал думать, что можно было бы изменить сумму цены на стороне клиента. Кроме того, похоже, что на стороне 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, например:

  1. Безопасность экспресс-оплаты PayPal с тихим вызовом ajax
  2. Как я могу защитить выполненные транзакции с помощью кнопок PayPal Smart Checkout на стороне клиента?
  3. Безопасная клиентская сторона PayPal Checkout?
  4. PayPal Checkout: есть безопасно ли получать платеж только с кодом на стороне клиента?

В целом консенсус был примерно таким: вы правы, это небезопасно, вам нужно делать это на бэкэнде.

Однако, хотя сейчас я понимаю, что это не кажется безопасным долгосрочным решением, ни один из ответов в сообщениях выше не дал некоторой дополнительной информации о том, как злоумышленники могут практически изменить код на стороне клиента. У меня довольно мало опыта в модификации клиентского кода JavaScript, поэтому я был бы очень признателен, если бы разобрался в процессе и узнал, в какой степени я должен защищать свое приложение.


person LukyFoggy    schedule 18.12.2020    source источник
comment
Простая точка останова отладчика в логике предоставит злоумышленнику полный доступ к изменению переменных, таких как this.pricing   -  person Taplar    schedule 18.12.2020


Ответы (1)


как злоумышленники практически модифицируют клиентский код. У меня довольно мало опыта в модификации клиентского кода JavaScript, поэтому я был бы очень признателен, если бы разобрался в процессе и узнал, в какой степени я должен защищать свое приложение.

Контрольная точка отладчика и изменение переменных из отладчика или консоли инструментов разработчика в браузере - очевидный способ для тех, кто разбирается в обычных инструментах, поставляемых со всеми основными браузерами.

Если вы этого не сделаете, самый простой способ изменить JS на стороне клиента - это загрузить файл JS или документ HTML-with-JS, внести любые изменения, которые вы хотите, а затем подать замену с расширением, например Resource Override и снова пройдите по потоку.

С другой стороны, клиентом может быть пользовательский исполняемый файл браузера, написанный с нуля на любом языке, со своим собственным или модифицированным интерпретатором JavaScript. Или просто браузер с открытым исходным кодом, такой как Firefox или Chromium, модифицированный и скомпилированный.

По сути, клиент имеет возможность отправлять, получать и выполнять любые команды, которые он (и, следовательно, злоумышленник) хочет. Это совершенно небезопасно, и ваш сервер должен проверять все, что вы хотите проверить. Не некоторые вещи, а все.

Поэтому всегда предполагайте, что клиент _ может_ быть 100% злоумышленником, и не доверяйте абсолютно ничему только потому, что он предположительно исходит из вашего собственного клиентского кода.

person Preston PHX    schedule 18.12.2020
comment
Хорошо, это определенно дало мне больше взглядов на безопасность на стороне клиента (небезопасность, чем остальные сообщения о stackoverflow, спасибо. - person LukyFoggy; 20.12.2020