使用 PHP 的 REMOTE_ADDR 变量来验证下载是个好主意吗?


Is it a good idea to use PHP's REMOTE_ADDR variable to verify a download?

所以我有一个网站,让你购买和下载mp3。mp3都是我做的。但是当用户完成PayPal结帐流程时(我已经设置了按钮和 IPN),我的 IPN 脚本会存储订单 ID 以及用户购买 MP3 的 IP 地址。IPN 脚本生成下载链接和电子邮件,这些链接链接到电子邮件PayPal用户。

因此,每当用户单击下载链接时,它都会将用户带到我的下载页面。在下载页面上,它会在数据库中找到下载 ID,以及用户购买 MP3 时的订单 ID、MP3 ID 和 IP 地址。我必须使用用户当前的IP地址验证数据库IP地址并让用户下载它,这是一个好主意吗?我使用以下方法存储 IP 地址:

getenv('REMOTE_ADDR')在 PHP 中。

还是我应该跳过任何验证并让单击该链接的任何人下载文件?

好吧,首先你应该考虑一下你问题背后的逻辑。

举个例子:

用户从您的网站购买了一首歌曲。 第一个问题应该是,如果您允许他暂时访问此下载链接(1,2,3小时,天...),或者是否可以调用该下载链接一次,或者是否终身保证该用户可以访问它。

设置此基本信息后,您可以继续。

案例 1(临时访问):存储 _REMOTE_ADDR 美元是一个好的开始,但是万一这个用户坐在 VPN 网络后面、局域网等......还有更多方法。您应该阅读有关HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR HTTP_X_FORWARDED...等等!

您甚至应该记住,所有 $_SERVER 属性都可以纵。因此,作为一个建议:您应该在将所有变量存储到数据库中之前对其进行清理,而不是盲目地信任它们。

回到问题:出于安全原因,您现在已经存储了IP,好的。 也许你害怕被欺骗。 没关系。 您的脚本会生成一个下载链接,该链接将发送到PayPal的电子邮件地址。 现在您有两个选择:

第一:用户已经通过PayPal验证了,一切都很好。 所以你不需要害怕任何事情。

在这种情况下,您应该考虑限定用户访问您的文件的时间。 现在想象一下,这个用户有几百万个朋友,而你是贾斯汀·汀布莱克(Justin Timberlake),而不是用户将他收到的链接发送给他所有尝试访问您的服务器并下载您的文件的朋友 - 假设您的服务器硬件会这样做!

所以首先更好的方法是划定访问链接的时间,例如 1,2,3 小时......购买后 - 仍然不完美,但这样可以避免上述情况。

如果您将其进一步限制为IP(假设您将学习如何以正确的方式获得它),则用户可以从他购买它的IP地址下载您的mp3。 当用户拥有智能手机并希望从家以外的其他任何地方下载时怎么办? 我说得对,用户必须创建一个帐户才能使用您的优惠?

而不是解决方案可能是存储某个用户下载MP3的频率。 在这里,您可以将限制设置为 50 次,这对于一首歌曲一次又一次地下载来说应该是安静得多......您甚至可以获得一个概述,如果用户将登录一次,或者该用户是否发布了他的登录数据以解决非法共享问题。

seccond:用户未通过PayPal进行验证并试图欺骗您。 想象一下,他将在PayPal创建一个帐户,并留下不正确的银行/帐户信息。 PayPal会先付钱给你,然后再尝试从不正确的帐户信息中重新获得钱。 当PayPal认识到用户帐户中留下的信息是错误的时,他们肯定会取消整个交易并从您的帐户中重新获得它。 最后接受PayPal时,你永远是输家。不好意思。

并且对自己保持安静诚实:如何有机会抓住一些试图欺骗你的人?! 0,0000000032423% 也许您的网站上存在因进行调查而损失大量金钱的全部风险。