【问题标题】:Is PayPal IPN authentication protocol safe enough?PayPal IPN 身份验证协议是否足够安全?
【发布时间】:2018-11-19 17:30:50
【问题描述】:

正如我们许多人所做的那样,我正在实施 PayPal 解决方案。通读开发者文档,我了解到 IPN 是异步消息协议,它触发支付履行。

PayPal 有一个官方方式来响应这些消息,以及如何在您的 IPN 侦听器上验证 IPN 消息的来源。侦听器从 PayPal 收到的每条 IPN 消息都包含一个 User-Agent HTTPS 请求标头,其值为 PayPal IPN (https://www.paypal.com/ipn) 他们强调不要使用此标头进行验证IPN 确实来自 PayPal,并且没有被篡改。相反,要验证这些事情,您必须使用下面概述的 IPN 身份验证协议,该协议包含四个步骤。

  1. PayPal HTTPS 向您的侦听器发布一条 IPN 消息,通知它发生了事件。
  2. 您的侦听器向 PayPal 返回一个空的 HTTP 200 响应。
  3. 您的侦听器 HTTPS 将完整的、未更改的消息发送回 PayPal;消息必须包含与原始消息相同的字段(以相同的顺序),并以与原始消息相同的方式进行编码。
  4. PayPal 会返回一个单词 - 已验证(如果消息与原始消息匹配)或无效(如果消息与原始消息不匹配)。

下图中的步骤 2、3、4 和 5 显示了此协议。

正如您在上面看到的,他们推荐了一些东西,用一条 [VERIFIED] 或 [INVALID] 消息进行响应,以防止欺诈。

我的想法是,任何假的 IPN 模拟器都可以将“已验证”状态消息回传给侦听器,因此没有任何意义。因此,我的问题是:

  • 这种解决方案真的安全吗?
  • 如果不是,什么方法可以真正防止欺诈并确保付款?

我想知道,如果我们可以交换一个密钥,它会更可靠。

欢迎提出任何想法。谢谢。

【问题讨论】:

    标签: paypal paypal-sandbox paypal-ipn


    【解决方案1】:

    协议的安全性取决于对PayPal的TLS证书的验证。

    由于某些 CA 未能检查他们向谁颁发了证书,因此您不能依赖通过 CA 进行检查。您应该保留一份您信任的 PayPal 证书列表。然后在连接时验证使用的证书是否在列表中。进一步选择足够强度的加密方法。

    【讨论】:

    • 感谢您的回答。我认为将 IPN 列入白名单可能会阻止您的列表中不存在的真实 IPN。这可能会阻止成功的付款在您的系统中注册。也许,交换密钥会更有效。
    • 这是不正确的。这取决于您将验证请求发送到 PayPal,而不是攻击者:您可以通过硬连接相关 URL 来完成,而不是从请求中派生它。无论如何,连接到您的是 PayPal,而不是相反。
    • 硬连线 URL 并不能防止 DNS 欺骗和中间人攻击。你真的必须检查证书。
    【解决方案2】:

    此过程的安全性取决于您将验证请求发送到 PayPal,而不是发送给攻击者:您可以通过硬连接相关 URL 来完成此操作,而不是从请求。

    为什么他们不只是要求您依赖客户端证书身份验证是另一个问题,但它已经有 20 年历史了,而且即使在那时设计也很糟糕。

    【讨论】:

    • 谢谢,我没有意识到有两个常量保存了贝宝服务器的网址,现在这很有意义。实际上,第一个实现是在 2009 年问世的,奇怪的是示例代码看起来很聪明,但气味却太多了。看起来,将应用程序机密作为在服务器端进行比较的属性超出了他们的范围。
    猜你喜欢
    • 2015-09-02
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多