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

时间:2009-07-14 07:22:31

标签: php paypal paypal-ipn

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

order allow,deny
deny from all

我也阻止了PayPal通知。

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

7 个答案:

答案 0 :(得分:7)

您可以安全地将对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添加了新地址,您可以将报告添加到电子邮件中并手动查看此类案例。

答案 1 :(得分:3)

你可以做很多事情:

  1. 为您的脚本添加一个不起眼的名称,以便不易猜测。
  2. 禁用文件夹
  3. 中的目录列表
  4. 检查主叫站点是否为paypal.com(或相关的IP地址等)

答案 2 :(得分:3)

为什么要这样做?

在IPN系统中,你首先只是使用cURL或fshock将传递给你的ipn脚本的变量反弹回paypal ...或者看看你能判断它是否是有效交易的响应...有人不能伪造一个在paypal本身不存在的交易变量......他们所能做的只是重复使用旧的交易信息来欺骗你的脚本..因为它存在于paypal上你的脚本将假设它是一个成功的付款...

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

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

在任何例外中打印出一个好句子告诉他们“这个剧本很健壮!不要试图欺骗我们!”

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

我认为处理Paypal请求的脚本是处理此问题的地方 - 在该脚本中,您需要确保该请求实际上来自Paypal。你可以使用一些不容易猜到的模糊URL来做到这一点。

如果可能的话,请查看IPN的共享密钥设置 - 通过这种方式,您可以更好地检查请求是否实际来自Paypal,尽管设置起来有点困难。

希望这有帮助!

答案 5 :(得分:2)

查看现场检查清单:

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

(开发者主页>如何> API> Go Live Checklist)

获取允许的IP地址列表

答案 6 :(得分:1)

现在我这样做了:

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

order allow,deny
deny from all

现在2个配置文件有很好的保护! ...但不是接收通知的脚本! 如果我尝试阻止目录列表(对于包含php脚本和配置文件夹的文件夹):

IndexIgnore *

paypal沙盒给我一个错误500!

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

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

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

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