贝宝 IPN 安全

Posted

技术标签:

【中文标题】贝宝 IPN 安全【英文标题】:PayPal IPN Security 【发布时间】:2011-02-20 20:11:51 【问题描述】:

PayPal IPN 向通知 URL 发送包含可变数量字段的 POST 请求,为了确认 POST 请求是合法的,我们需要重新提交相同的请求以及额外的 cmd=_notify-validate 字段到 PayPal,然后回复VERIFIEDINVALID

我的问题是,为什么我们需要将请求重新发送到 PayPal?这样的东西还不够吗?

if (preg_match('~^(?:.+[.])?paypal[.]com$~i', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)

    // request came from PayPal, it's legit.

如果我们可以信任服务器正确解析 IP,我假设我们可以信任来自 PayPal 的所有请求,不是吗?

【问题讨论】:

【参考方案1】:

这是另一个解决方案 - https://***.com/a/4988281/2165415

(因为您的 IPN 页面可能需要检查呼叫的来源)

【讨论】:

您是否意识到我是这个问题的提问者并且您正在链接到我的另一个答案? :-P【参考方案2】:

我知道这个问题已经很老了,但是:

攻击者甚至不需要欺骗他的 ip 或执行任何类型的 MITM 来通过您的验证:

    他使用 IP 地址 x.y.z.t 从自己的计算机连接。 您的服务器调用 gethostbyaddr("x.y.z.t"),它会发送一个对名称 t.z.y.x.in-addr.arpa 的 dns 查询。 如果 x.y.z.t 属于攻击者,他很可能(至少)也控制着 dns 域 z.y.x.in-addr.arpa(因为其中包含他自己的 ip)。因此,他可以返回“paypal.com”以响应该查询。 您的服务器从攻击者的 dns 服务器收到“paypal.com”,并且您的验证检查成功。

按照 Lobos 的建议,通过向 paypal 发送请求来击败此攻击。

【讨论】:

【参考方案3】:

这是我发现的最简单的方法,也按照 PayPal 的建议。我使用 http_build_query() 从从 paypal 发送到网站的帖子中构造 url。 Paypal 文档声明您应该将其发回以进行验证,这就是我们对 file_get_contents 所做的。你会注意到我使用 strstr 来检查单词 'VERIFIED' 是否存在,所以我们继续函数,如果没有,我们返回 false...

$verify_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate&' . http_build_query( $_POST );   

if( !strstr( file_get_contents( $verify_url ), 'VERIFIED' ) ) return false;

【讨论】:

当然,但我认为你没有完全理解我的问题。 这是您第二次发布相同的答案(第一次是here)。可以重复使用相同的示例,但请考虑针对每个问题更具体地调整您的答案。 好吧,如果有人设法欺骗您的 IP 地址,那您就大错特错了——我在这里给出相同答案的原因是人们在搜索如何验证 paypal IPN 时发现了这一点,而原始帖子是绝对不是怎么做。【参考方案4】:

如果有人设法更改运行您的 ipn 侦听器的机器上的 hosts 文件,整个事情就会崩溃;

坏人发送虚假付款通知

您的受感染服务器将副本发送到“paypal.com”,实际上指向坏人的机器

坏人回复已验证,收到货就好像他们已经付款一样。

这并不是什么大问题,就像一个人可以读取您的主机文件一样,他们可能只是将付款记录手动放入您的数据库中,或者造成许多其他损害。

只是一个想法。

【讨论】:

【参考方案5】:

PayPal 只是为了您自己的网站/应用程序的利益实施更高的安全标准。

IP 欺骗很容易欺骗您的示例函数,因为仅依靠 REMOTE_ADDRESS 很容易受到攻击。

当您处理金融交易时,安全性非常重要。如果我可以欺骗 IPN 请求,我可以欺骗您的站点/应用程序执行虚假交易。通过向已知且受信任的位置发送额外的请求,我们获得了更高标准的凭据以进行操作。整个原始 IPN 请求在此确认中发送,以便 PayPal 可以验证所有交易详细信息实际上是有效的,从而防止中间人攻击,即攻击者修改详细信息(例如,更改价格或数量) ) 的其他有效请求,因为它是从 PayPal 发送到您的服务器的。

【讨论】:

我了解 PayPal 的立场,并且完全同意 MITM 漏洞(尽管我的印象是,这类攻击在现实中比在理论上更难对付)。我不明白的是如何欺骗 REMOTE_ADDR - 愿意举一个(实际的)例子吗? 编辑为“as”而不是“also”,我的意思是 IP 欺骗是改变 REMOTE_ADDRESS 的一种方式。对于大多数设置/目标,您是对的,欺骗可能是不可能的(但在 wifi 热点、大学宿舍和其他具有共享上行链路的开放子网中则不然)。一旦您真正将自己定位为邻居,更改数据包就相当简单了。【参考方案6】:

以下是回复 POST 的理由,来自 IPN Guide

你的听众必须回应每一个 消息,无论您是否打算 用它做任何事情。如果你不 回应,贝宝假设 未收到消息并重新发送 消息。贝宝继续 定期重新发送消息,直到 您的听众发送正确的 回消息,虽然间隔 重发消息之间增加每个 时间。

重要提示:PayPal 预计会收到 在 30 内回复 IPN 消息 秒。

【讨论】:

这实际上是来自 Paypal 的非常具有误导性的信息。所需的是您使用 HTTP 200 响应他们的 POST 请求并且没有数据。您不需要按照人们上面描述的方式验证来自 Paypal 的数据。实际上非常重要的过程如下:1)贝宝发布到您的服务器2)在单独的连接上您将数据发布回贝宝3)贝宝响应验证(或不)4)您响应贝宝原始POST一个空的 200。

以上是关于贝宝 IPN 安全的主要内容,如果未能解决你的问题,请参考以下文章

贝宝集成 - IPN

需要帮助使用贝宝 ipn,标记

贝宝 IPN 无法在另一个贝宝帐户上运行

贝宝 - IPN 页面

贝宝 IPN 测试

客户关闭贝宝网站时不会触发 IPN