限制来自php / apache或.htaccess的http请求?

时间:2011-01-09 21:41:30

标签: php apache .htaccess

我的网站最近一直在进行漏洞扫描,我不负责。我试图阻止任何请求超过合理数量的页面的IP。我实际上不确定可能有4-5个请求并阻止它们。

我已经看到用光速网络服务器完成了这个,但我有apache。我如何限制PHP请求到我的页面,所以如果用户超过限制,他们将被阻止从我的网站30分钟? (我真的不确定它的数量是多少。真正的用户不会被阻止。)

3 个答案:

答案 0 :(得分:1)

我使用它来阻止自定义IP地址,只需粘贴脚本:

    <?php
$deny = array("111.111.111", "222.222.222", "333.333.333");
if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {
   header("location: http://www.mywarningpage_or_anywhereyouwouldlike.com/");
   exit();
} ?>

要自动阻止某人,你必须随着时间创建ip的历史记录。

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$myFile = "ip_log.txt";
$fh = fopen($myFile, 'a') or die("can't open file");
$stringData = $ip.":"$time."\n";
fwrite($fh, $stringData);
fclose($fh);

现在自动化让第一个脚本获取数组

$ip = $_SERVER['REMOTE_ADDR'];
$ips = file("ip_log.txt")
$count = count($ips);
for ($i=0;$i<=$count;$i++){
if (strpos($ips[$i],$ip)==true){
$teile = explode(" ", $pizza);
$ip_h[] = $teile[0]; // Teil1
$time_h[] = $teile[1]; // Teil2
}

//now you have arrays of the actual users ip with times.
// now set a timeinterval of amount of requests you define as "spam"
// and check with if for through array to deny similar like first script

由我编写,未经测试

答案 1 :(得分:1)

在这样的解决方案中,重要的是,实际的“阻塞”是非常便宜的资源成本。正确认识攻击者而不是偶然禁止某人也很重要,但也不要太开放,以免在阻止某人之前浪费了大量资源。

但是,您不是第一个遇到此问题的人。

有一个很棒的apache模块叫做mod_evasive,配置完全就是这样。

我曾经在服务器上做了一个非常简单的技术(因为它对于那个具有类似流程的应用程序效果更好),它有这样的流程:

我的应用程序在本地apc缓存中计算一个变量,该密钥是当天的当前小时和用户ip地址,并检查是否已达到限制。

如果是这样,ip地址写入了一个作业日志,其中一个cronjob选择了它并使用iptables添加了一个过滤器,因此该ip的软件包就被删除了。

所以他们甚至都没有到达网络服务器,所用的资源也很少。

每天一次,添加的规则被清除。

答案 2 :(得分:0)

我想我们都知道接下来会发生什么(记住每个文件/图像等都是单个请求)。

建议一个替代方案,为什么不一次只阻止一个有问题的IP地址 - 你可以从流量日志中获取有问题的IP,并且添加一个“{{1}是微不足道的“将IP地址块设置为httpd配置。 (此外,与基于PHP的方法不同,这也适用于图像等。)

否则,可能会面临阻止合法网络流量,Google蜘蛛等的风险。