PHP限制访问频率,简单防止CC攻击

PHP限制访问频率,简单防止CC攻击

介绍:

由于自己使用API经常被频繁请求,还偶尔被CC攻击,找到一套防止非正常高频率请求和防止一般CC攻击的PHP源码。

优势:

  • 简单易用,无论你懂不懂PHP开发,只要会复制粘贴就行。
  • Memcached内存缓存技术,高性能,高并发。
  • 精准无误,0误封。
  • 能防护QPS10000以内的CC攻击,看机器配置,有可能更高。
  • 支持范围较广,直接你网站支持PHP就行。
  • 源码简单,可自行修改,可以套自己喜欢的前端模板主题。

要求:

  • PHP版本 ≥ 7.2
  • PHP需安装Memcached扩展
  • Memcached ≥1.6

使用方法:

以下开源代码添加到你网站核心文件中,相当于你网站任何页面都会引用的一个文件。类似于:config.php
或者根据你的程序逻辑添加到需要防CC的PHP文件头部即可。

源码:

<?php
/**
* 防止频繁请求,防范CC攻击,支持上万并发
* 原创作者:小伟
* 转载请保留版权,谢谢!
*/
ini_set("display_errors", "Off");
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
extension_loaded('memcached') or die('memcached扩展未安装!');
    $logPath = $_SERVER['DOCUMENT_ROOT'] . '/waf/waf.log'; //日志记录文件保存路径,$_SERVER['DOCUMENT_ROOT']是网站根目录
    $fileht = $_SERVER['DOCUMENT_ROOT'] . '/waf/ban.log'; //被拉黑IP记录文件保存路径
if (!file_exists($logPath)) {
    @mkdir($_SERVER['DOCUMENT_ROOT'] . '/waf/', 0777, true);
    @file_put_contents($logPath, '');
    @file_put_contents($fileht, '');
}
    $allowtime = 2; //防刷新时间(秒)
    $allownum = 5; //防刷新次数(比如2秒5次,超过就警告)
    $allowRefresh = 10; //在此警告次数之后拉黑IP
    $bantime = 600; //封禁时间,超时自动解封(秒)
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
    $uri = $_SERVER['PHP_SELF'];
    $cache = new Memcached();
    $cache->addServer('127.0.0.1', '11211') or die('memcached连接失败!');
    $inban = $cache->get('waf-ban-' . $ip);
if ($inban) {
    header("HTTP/1.1 403 Forbidden");
    exit('<h1>403 Forbidden 非法访问</h1>
    <p>你的请求似乎不符合常理,已被服务器防火墙拦截,如有疑问请联系管理员QQ:XXXXXX</br>如果你在开发测试过程中超频被封IP,请等待' . ($bantime / 60) . '分钟后自动解封</br>你的IP:' . $ip . '</p>');
}
    $wafarr = $cache->get('waf-' . $ip);
if (!$wafarr) {
    $wafarr = [
        'path' => $uri,
        'time' => time() + $allowtime,
        'sum' => 1,
    ];
    $cache->set('waf-' . $ip, $wafarr, time() + $allowtime);
} else {
    if ($wafarr['sum'] > $allownum) {
        $wafsum_arr = $cache->get('waf-sum-' . $ip);
        if (!$wafsum_arr) {
            $wafsum_arr = [
            'sum' => 1,
            ];
            $cache->set('waf-sum-' . $ip, $wafsum_arr, time() + $bantime);
        } else {
            if ($wafsum_arr['sum'] > $allowRefresh) {
                $cache->set('waf-ban-' . $ip, 1, time() + $bantime);
                file_put_contents($fileht, $ip . "n", FILE_APPEND);
            } else {
                $wafsum_arr['sum']++;
                $cache->set('waf-sum-' . $ip, $wafsum_arr, time() + $bantime);
            }
        }
        file_put_contents($logPath, $ip . '--' . date('Y-m-d H:i:s', time()) . '--' . $uri . "n", FILE_APPEND);
        header("HTTP/1.1 403 Forbidden");
        exit("请求频率QPS超过限制,请酌情访问,多次提醒后会封禁IP!");
    } else {
        $wafarr['sum']++;
        $cache->set('waf-' . $ip, $wafarr, $wafarr['time']);
    }
}
© 版权声明
1:本网站名称:源码库
2:本站永久网址:www.ymkuz.com
3:本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
4:分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
5:本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
6:本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7:如有链接无法下载、失效或广告,请联系管理员处理!
8:文章投稿-投诉建议E-mail:yunduanw@qq.com 站长QQ:99767152
THE END
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容