【问题标题】:Isn't this a security risk?这不是安全风险吗?
【发布时间】:2020-04-28 18:35:37
【问题描述】:

我即将在网站上实施付款。

我见过像使用这个 Javascript 代码这样的解决方案

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);

但这段 Javascript 代码对于查看页面源代码的任何人来说都是完全可见的。

还有更多,假设我想将成功的购买存储到我的服务器。帖子将可见。

这不是安全风险吗?

有什么方法可以保护它吗?

【问题讨论】:

  • JavaScript 代码“可见”不会使事情变得不安全。我建议您熟悉并阅读 Payment Request API 本身的安全性 - developers.google.com/web/ilt/pwa/… 以更好地回答您的问题这种方法有多安全。仍然由后端服务器来确定请求是否合法 - 在安全性方面,您应该永远仅依赖前端代码。

标签: javascript payment-request-api


【解决方案1】:

只要 JS 代码不公开您应提供给支付网关的任何凭据,您就是安全的。

提供的示例是围绕支付请求生态系统构建的,该生态系统是一种用于收集客户支付凭证的本地浏览器方法。

如果攻击者要从代码中了解您的付款方式,他所能做的所有黑客行为都仅限于付款 - 这很好。

【讨论】:

  • 好的,但是如果我将成功的购买发布到服务器上以便,例如,将该购买保存在数据库中,则可以通过该购买进行虚假购买......或者至少是黑客可以试试。反正我现在看得更清楚了。现在我必须想出一种方法来存储这些信息,我的意思是这种购买的结果,以一种安全的方式在我的服务器上。谢谢。
  • 服务器收到支付请求后,会将卡信息发送给支付处理器。处理完成后,支付处理器将持有发卡行(卡)银行的资金。此时,付款处理器会向您发送“成功”回复 - 之后您可以将付款保存到表中。现在,如果攻击者想要在您的系统中保存任意记录,他需要一张有资金的有效卡。
【解决方案2】:

这不是安全风险吗?

仅当服务器端代码相信客户端提交的费用而不检查它们。

【讨论】:

  • 我的意思是:成功购买,我将其发布到我的数据库中。一切都清晰可见。
  • @SpaceDog — 好吧,不要。使用服务器端代码检查价格是否正确。
  • 如果一切都发生在 javascript 中,我该怎么做?看到if (response.status === 200)...
  • @SpaceDog 并非所有事情都发生在JavaScript - 我建议您阅读有关将支付系统集成到网站中的内容,或者更好的是,使用能够处理安全性和其他重要事项的服务如果你不知道自己在做什么。如果您的服务器端代码不安全并且没有正确检查传入请求的有效性,那么您是否在前端看到内容并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多