全球主机交流论坛

标题: php怎么限制某个ip或ip段过多的请求 [打印本页]

作者: muyang    时间: 2015-3-10 18:30
标题: php怎么限制某个ip或ip段过多的请求

如题

如果某个ip或ip段,一分钟内,请求了100次,那就暂时限制它,限制1小时,2小时之类的

(限制的方法,最好可以自己指定,比如想让它在限制时间内显示404)



求大牛帮写个具体的php实现代码,拜谢!
作者: 小磊    时间: 2015-3-10 18:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小夜    时间: 2015-3-10 18:35
本帖最后由 小夜 于 2015-3-10 18:37 编辑

想不出办法,如果说用PHP判断,那么首先就要先执行一遍PHP。

还要记录数据库里面,每个IP,请求了多少次。然后,他下次连接的时候,还要再执行PHP,判断是不是在库里,在库里就404;算限制了,下次连接,还是要执行PHP,入库查询,判断……感觉死循环了。

建议还是直接上个软件或硬件防火墙解决吧,在连接时就解决。

像nginx就有类似功能,限制连接数量。或者,用iptables来限制单个IP的连接数量。
作者: malong101    时间: 2015-3-10 18:43
litespeed 好像有这个功能 控制 每个 IP 的访问 间隔 目测可以防 采集 不过 个人流量太少 没测试过 具体怎么样 不清楚
作者: 欧阳逍遥    时间: 2015-3-10 18:44
你要防 CC 么??
作者: cdn    时间: 2015-3-10 18:48
数字加速云有这功能,频繁请求需要输入验证码
作者: opelnic    时间: 2015-3-10 20:00
可以在访问的时候设置session,用session来做可以。代码网上有。
作者: HeyMyLady    时间: 2015-3-10 20:04
<?  
//禁止某个IP
$banned_ip = array (
"127.0.0.1",
//"119.6.20.66",
"192.168.1.4"
);
if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) )
{
die ("您的IP禁止访问!");
}
//禁止某个IP段
$ban_range_low=ip2long("119.6.20.65");
$ban_range_up=ip2long("119.6.20.67");
$ip=ip2long($_SERVER["REMOTE_ADDR"]);
if ($ip>$ban_range_low && $ip<$ban_range_up)
{
echo "您的IP在被禁止的IP段之中,禁止访问!";
exit();
}
?>
作者: muyang    时间: 2015-3-10 20:12
opelnic 发表于 2015-3-10 20:00
可以在访问的时候设置session,用session来做可以。代码网上有。

大牛,搜不出来啊。。
作者: opelnic    时间: 2015-3-10 20:40
muyang 发表于 2015-3-10 20:12
大牛,搜不出来啊。。

晚点我回你把,家里电脑有这个东西。不过是以前PHP 5.2的
作者: muyang    时间: 2015-3-10 21:24
opelnic 发表于 2015-3-10 20:40
晚点我回你把,家里电脑有这个东西。不过是以前PHP 5.2的

谢大牛,谢楼上各位兄弟的解答
作者: muyang    时间: 2015-3-10 21:27
HeyMyLady 发表于 2015-3-10 20:04

谢谢这位兄弟的回答,不过我想实现的是,如果请求过多,就自动限制这类ip

前提是我不知道有哪些具体的ip需要去封
作者: aoron    时间: 2015-3-10 21:48
这个实现起来不难,用exec和iptables就可以,想通用一些直接sleep函数
作者: opelnic    时间: 2015-3-10 22:09
muyang 发表于 2015-3-10 21:24
谢大牛,谢楼上各位兄弟的解答
  1. <?php
  2. /**
  3. * @author 天涯
  4. * [email protected]
  5. */
  6. //代理IP直接退出
  7. empty($_SERVER['HTTP_VIA']) or exit('Access Denied');
  8. //防止快速刷新
  9. session_start();
  10. $seconds = '3'; //时间段[秒]
  11. $refresh = '5'; //刷新次数
  12. //设置监控变量
  13. $cur_time = time();
  14. if(isset($_SESSION['last_time'])){
  15.         $_SESSION['refresh_times'] += 1;
  16. }else{
  17.         $_SESSION['refresh_times'] = 1;
  18.         $_SESSION['last_time'] = $cur_time;
  19. }
  20. //处理监控结果
  21. if($cur_time - $_SESSION['last_time'] < $seconds){
  22.         if($_SESSION['refresh_times'] >= $refresh){
  23.                 //跳转至攻击者服务器地址
  24.                 header(sprintf('Location:%s', 'http://www.baidu.com'));
  25.                 exit('Access Denied');
  26.         }
  27. }else{
  28.         $_SESSION['refresh_times'] = 0;
  29.         $_SESSION['last_time'] = $cur_time;
  30. }
  31. ?>
复制代码

作者: psdshow    时间: 2015-3-10 22:09
思路都有了 怎么做应该很简单吧
使用memcache来做这事

1.记录某个IP开始计数时间
2.记录ip在这个时间段的访问次数(累加)
3.当访问次数超过限制时
3.1 如果时间超过计数时间段 重置计数开始时间和访问次数
3.2 如果在时间段内 把这个ip或者ip段设置为禁止访问



作者: HeyMyLady    时间: 2015-3-10 22:17
opelnic 发表于 2015-3-10 22:09

大牛
作者: cnx    时间: 2015-3-10 22:20
论坛程序一般都有这种防刷机制。
作者: h0stl0c    时间: 2015-3-11 08:38
你要是防攻击,在第七层做这个没用的。
至少要到第3或4层,比如iptables。
作者: ghost    时间: 2015-3-11 14:20
本帖最后由 ghost 于 2015-3-11 14:23 编辑

這種簡單的判別,
在越上層做過濾,資源成本就越高.

在系統層的話,可以用抓取 netstat 的 tcp 連線數,
統計數量後將超標的加進 iptables, firewalld 裡.

不過有個缺點,下層的,就只能做些簡單,不須各種進階過濾的.
作者: 羞涩    时间: 2015-3-11 14:45
php来防CC 是作死,
最好在iptables 或者nginx上做。




欢迎光临 全球主机交流论坛 (https://www.91ai.net/) Powered by Discuz! X3.4