Isn't this a security risk?

108 Views Asked by At

I am about to implement payments on a website.

I have seen solutions like using this Javascript code

function onBuyClicked() {
  if (!window.PaymentRequest) {
    // PaymentRequest API is not available. Forwarding to
    // legacy form based experience.
    location.href = '/checkout';
    return;
  }

  // Supported payment methods
  var supportedInstruments = [{
      supportedMethods: ['basic-card'],
      data: {
        supportedNetworks: [
          'visa', 'mastercard', 'amex', 'discover',
          'diners', 'jcb', 'unionpay'
        ]
      }
  }];

  // Checkout details
  var details = {
    displayItems: [{
      label: 'Original donation amount',
      amount: { currency: 'USD', value: '65.00' }
    }, {
      label: 'Friends and family discount',
      amount: { currency: 'USD', value: '-10.00' }
    }],
    total: {
      label: 'Total due',
      amount: { currency: 'USD', value : '55.00' }
    }
  };

  // 1. Create a `PaymentRequest` instance
  var request = new PaymentRequest(supportedInstruments, details);

  // 2. Show the native UI with `.show()`
  request.show()
  // 3. Process the payment
  .then(result => {
    // POST the payment information to the server
    return fetch('/pay', {
      method: 'POST',
      credentials: 'include',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(result.toJSON())
    }).then(response => {
      // 4. Display payment results
      if (response.status === 200) {
        // Payment successful
        return result.complete('success');
      } else {
        // Payment failure
        return result.complete('fail');
      }
    }).catch(() => {
      return result.complete('fail');
    });
  });
}

document.querySelector('#start').addEventListener('click', onBuyClicked);

but this code being in Javascript is completely visible to anyone looking at the page source.

And more, suppose I want to store a successful purchase to my server. The post will be visible.

Isn't this a security risk?

Is there any way to protect this?

2

There are 2 best solutions below

2
Charlie On BEST ANSWER

As long as the JS code doesn't expose any credentials you should provide to your payment gateway, you are secure.

The example provided is built around the Payment Request eco system which is a native browser approach in collecting client's payment credentials.

If an attacker is to learn your payment method from the code, all the hacks he can do is limited to paying - which is good.

4
Quentin On

Isn't this a security risk?

Only if the server-side code believes the costs submitted from the client without checking them.