6

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

order allow,deny
deny from all

我也屏蔽了贝宝通知。

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

4

7 回答 7

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

于 2009-07-14T12:53:25.897 回答
3

你可以做很多事情:

  1. 给你的脚本起一个不起眼的名字,这样它就不容易被猜到。
  2. 禁用文件夹中的目录列表
  3. 检查调用站点是否为 paypal.com(或相关 IP 地址等)
于 2009-07-14T07:27:13.667 回答
3

你为什么要这样做?

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

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

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

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

于 2010-03-25T15:27:18.250 回答
2

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

order deny, allow
deny from all
allow from [Paypal-IP]
于 2009-07-14T07:28:01.483 回答
2

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

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

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

希望这可以帮助!

于 2009-07-14T07:37:32.757 回答
2

查看上线清单:

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

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

获取允许的 IP 地址列表

于 2011-05-22T09:38:34.740 回答
1

现在我已经这样做了:

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

order allow,deny
deny from all

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

IndexIgnore *

贝宝沙箱给我一个错误500!

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

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

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

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

于 2009-07-14T08:17:19.853 回答