7

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

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

if (preg_match('~^(?:.+[.])?paypal[.]com$~i', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)
{
    // request came from PayPal, it's legit.
}

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

4

6 回答 6

6

这是我发现的最简单的方法,也是根据 PayPal 建议的。我使用 http_build_query() 从从 paypal 发送到网站的帖子中构造 url。Paypal 文档声明您应该将其发回以进行验证,这就是我们对 file_get_contents 所做的事情。您会注意到我使用 strstr 检查是否存在“已验证”一词,因此我们继续执行该函数,如果不存在则返回 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;
于 2011-07-15T16:30:39.707 回答
5

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

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

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

于 2010-05-18T16:11:10.810 回答
4

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

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

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

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

于 2013-01-03T15:03:35.460 回答
2

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

  • 坏人发送虚假付款通知

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

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

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

只是一个想法。

于 2010-09-28T19:47:20.443 回答
1

这是从IPN 指南回复 POST 的原因:

您的听众必须对每条消息做出响应,无论您是否打算对它做任何事情。如果您不回复,PayPal 将假定未收到该消息并重新发送该消息。PayPal 会继续定期重新发送消息,直到您的听众发回正确的消息,尽管重新发送消息之间的间隔每次都会增加。

重要提示:PayPal 希望在 30 秒内收到对 IPN 消息的响应。

于 2010-05-18T11:50:22.397 回答
0

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

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

于 2014-04-08T12:51:21.423 回答