保护接收paypal IPN通知的php脚本

Posted

技术标签:

【中文标题】保护接收paypal IPN通知的php脚本【英文标题】:Protect php script that receive paypal IPN notifications 【发布时间】:2010-11-10 13:41:06 【问题描述】:

在我的网站中,我集成了一个接收 IPN 通知并向客户发送许可证密钥的 php 脚本。此脚本与 php 脚本所需的其他 2 个 php 文件位于一个文件夹中...如何保护此文件夹?如果我将.htaccess 放入其中:

order allow,deny
deny from all

我也屏蔽了贝宝通知。

我该如何保护它?我需要吗?

【问题讨论】:

我不确定每个人都理解您所说的“保护此文件夹”是什么意思。您要拒绝列出此文件夹的内容吗?还是拒绝公众执行另外两个 php 文件?还是别的什么? 【参考方案1】:

您可以安全地将您的 IPN 脚本的访问权限限制为以下 IP 地址列表:

216.113.188.202
216.113.188.203
216.113.188.204
66.211.170.66

这可以通过以下方式完成:

if (!in_array($_SERVER['REMOTE_ADDR'],array('216.113.188.202','216.113.188.203','216.113.188.204','66.211.170.66')) 
header("HTTP/1.0 404 Not Found");
exit();

只有 Paypal 才能通过这种方式访问​​ IPN 脚本。

这个 IP 地址列表多年来一直相当稳定。如果 Paypal 添加了新地址,您可以将报告添加到电子邮件并手动查看此类案例。

【讨论】:

谢谢!!!!除了域,有什么方法可以做同样的事情吗?换句话说... $_SERVER['REMOTE_ADDR'] 返回发件人服务器的ip地址...并获取远程域? 沙盒的 IP 是否相同?您能否详细说明如果他们添加 IP 该怎么办?提前致谢! 答案发布于 2009 年,因此该列表可能已过时。检查ppmts.custhelp.com/app/answers/detail/a_id/92【参考方案2】:

你可以做很多事情:

    为您的脚本起一个晦涩难懂的名称,使其不易被猜到。 禁用文件夹中的目录列表 检查调用站点是否为paypal.com(或相关IP地址等)

【讨论】:

我从来没有这样做过...禁用文件夹中所有文件的目录列表我需要在此文件夹中放置一个.htaccess ... IndexIgnore * ...对吗? 我已经尝试过了,但如果我尝试浏览 php 脚本,我会收到错误 500!【参考方案3】:

你为什么要这样做?

在 IPN 系统中,您首先只需使用 cURL 或 fshock 或其他任何方式将传递给您的 ipn 脚本的变量反弹回贝宝...查看响应您可以判断它是否是有效交易...有人不能伪造贝宝本身不存在的交易变量...他们所能做的就是再次重用旧交易信息来欺骗您的脚本..因为它存在于贝宝上,您的脚本将假设它是成功的付款...

所以您可以通过将 txn_id 与您的数据库进行比较来防止这种情况发生,如果您的数据库中已经存在这意味着有人试图使用已经记录的交易信息来欺骗您...

既然你做了那些关心那些调用这个 ipn 脚本的人的检查......它不会为他们工作,因为你检查了 paypal 和你的数据库的变量......

在任何例外情况下,打印一个漂亮的句子告诉他们“这个脚本很健壮!不要试图欺骗我们!”

【讨论】:

+1 没错。如果您不知道如何根据规范进行错误处理或实施协议,您可能根本不应该处理付款。 为什么要添加安全性?只是钱。【参考方案4】:

如果您知道 PayPal 将使用该脚本的 IP,请尝试:

order deny, allow
deny from all
allow from [Paypal-IP]

【讨论】:

没有办法过滤域名而不是ip地址吗? 我找到了! .. 订单拒绝,允许 - 全部拒绝 - 允许来自 .*paypal\.com.* 您可以在此链接找到paypal相关IP的列表:ppmts.custhelp.com/app/answers/detail/a_id/92【参考方案5】:

我不建议关闭所有 IP,因为您无法确定 Paypal 是否会始终保持来自同一 IP 的请求。如果他们决定更改其 IP 范围,您的设置将会中断,可能不会通知您。

我认为处理 Paypal 请求的脚本是处理此问题的地方 - 在该脚本中,您需要确保请求实际上来自 Paypal。您可以通过使用一些不易猜到的晦涩 URL 来做到这一点,正如建议的那样。

如果可能,请查看 IPN 的共享密钥设置 - 这样您就可以更好地检查请求是否确实来自 Paypal,尽管设置起来有点困难。

希望这会有所帮助!

【讨论】:

我也没有设置共享密钥...现在我检查货币,金额和业务电子邮件是否正确...然后我想检查交易ID是否是独一无二的……但要做到这一点!我必须设置一个数据库来存储所有交易的信息......但我从未使用过数据库,我不知道如何使用! 请“未知(谷歌)”,不要生我的气,但你不认为在发布之前获得一些 PHP、Web 和数据库编程经验不会有什么坏处吗?涉及真钱的公开场合??? 你是对的!事实上,我没有发布和发布任何东西!我的网站离线了!【参考方案6】:

查看上线清单:

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_api_golivechecklist

(开发者主页 > 操作方法 > API > 上线清单)

获取允许的 IP 地址列表

【讨论】:

这应该得到检查!非常感谢你!因为你而收藏了这篇文章。【参考方案7】:

现在我已经这样做了:

在存储 php 脚本和 2 个配置文件的文件夹中,我创建了另一个文件夹,我在其中移动了 2 个配置文件,并在其中放置了带有以下代码的 .htaccess:

order allow,deny
deny from all

现在这两个配置文件有了很好的保护! ...但不是接收通知的脚本! 如果我尝试使用以下命令阻止目录列表(包含 php 脚本和配置文件夹的文件夹):

IndexIgnore *

paypal 沙盒给我一个错误 500!

所以为了保护脚本,我唯一能做的就是在它的头部放置一个验证通知来自 paypal.com 的条件?

最后我在 php 脚本的头部添加了一个基于远程主机名的 if 语句:

 $remote_host = gethostbyaddr($_SERVER['REMOTE_ADDR']);

如果有人感兴趣,也可以查询$_SERVER['REMOTE_HOST'],但必须在服务器上配置httpd.conf文件。

【讨论】:

以上是关于保护接收paypal IPN通知的php脚本的主要内容,如果未能解决你的问题,请参考以下文章

配置 Wordpress 以接收 Paypal IPN 通知

“PayPal Here”是不是发送 IPN 通知?

如何在 PHP 中使用 IPN(即时付款通知)在 Paypal 中配置定期付款

paypal 的IPN通知调用出错

PayPal IPN 沙盒 - 更改通知 URL 不会更新

贝宝沙箱 IPN 通知 url 没有响应