【问题标题】:Prevent IPs from downloading a file multiple times on server防止IP在服务器上多次下载文件
【发布时间】:2017-06-16 07:54:01
【问题描述】:

我有一个程序,用户可以通过发布到 php 页面的按钮从我的站点下载该程序。 php 将下载请求记录到我的数据库中,然后提供实际程序供他们下载。但是,我不时注意到某些 IP 会每半小时下载一次程序……有时几天内会下载数百次。不确定它是什么,假设它是一个机器人,并且 IP 总是在罗马尼亚或匈牙利等国家。

最初我在我的 .htaccess 中阻止 IP,但我不想每次都这样做。所以我在我的 php 中添加了代码,它只允许用户每天下载特定的 # 次程序。这很好用,但是,对于某人来说,只需获取我的程序的直接 url 并绕过 php 逻辑以这种方式下载它就足够了。

1) 有没有办法防止这种情况发生?可以修改 .htaccess 以防止直接下载文件但允许我的 php 提供它吗?

2) 我是否应该为此担心?我使用的是共享服务器,所以我真的只关心带宽影响。

【问题讨论】:

  • 我不知道您是否可以阻止 .htaccess 文件中的直接下载,但是您可以将文件移到可公开访问的目录之外并让 php 脚本从那里提供它(在检查 IP 并申请之后限制)
  • IP != 用户。你需要一个合适的用户管理系统
  • 您可以将 IP 保存到您的数据库中。当页面加载时检查数据库,如果找到 ip 然后使用 if else 语句来防止下载链接出现?并使用保存在数据库中的动态链接,防止重复访问同一链接。
  • 1) 你不应该和 2) 你不应该。想想 NAT:多个有效用户共享同一个公共 IP。然后考虑运营商级 NAT:数千 个有效用户共享同一个公共 IP。现在想想任何类型的潜在攻击者:拥有使用数千个不同 IP 地址的知识和技术的邪恶头脑。

标签: php linux apache .htaccess


【解决方案1】:

如果你不想让用户绕过 PHP 逻辑,你可以用 PHP 脚本渲染和输出文件。

<?php
$file = some file from query;

if (some logic matches)
    die('Download forbidden');

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
?>

见:http://php.net/manual/en/function.readfile.php

假设你的文件存放在/files/,把脚本放在/down.php之类的地方,然后在.htaccess/files/中添加以下代码。

Deny from all

更多关于这个,你可以看看:Deny access to one specific folder in .htaccess

另外,如果你真的关心带宽,你可以增强你的下载禁止逻辑,比如创建用户系统,或者将用户IP放入数据库来管理/限制每个用户的总下载带宽。

【讨论】:

  • 谢谢。这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多