找回密码
 立即注册
查看: 94|回复: 0

利用memcached扩展实现防CC攻击

[复制链接]

140

积分

0

金钱

140

金币

实习版主

积分
140
    发表于 2024-3-26 18:40:39 | 显示全部楼层 |阅读模式
    1. <?php
    2. ini_set("display_errors", "Off");

    3. error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
    4. extension_loaded('memcached') or die('memcached扩展未安装!');
    5. $logPath = $_SERVER['DOCUMENT_ROOT'] . '/waf/waf.log'; //日志记录文件保存路径,$_SERVER['DOCUMENT_ROOT']是网站根目录
    6. $fileht = $_SERVER['DOCUMENT_ROOT'] . '/waf/ban.log'; //被拉黑IP记录文件保存路径
    7. if (!file_exists($logPath)) {
    8.     @mkdir($_SERVER['DOCUMENT_ROOT'] . '/waf/', 0777, true);
    9.     @file_put_contents($logPath, '');
    10.     @file_put_contents($fileht, '');
    11. }
    12. $allowtime = 5; //防刷新时间(秒)
    13. $allownum = 5; //防刷新次数(比如2秒5次,超过就警告)
    14. $allowRefresh = 0; //在此警告次数之后拉黑IP
    15. $bantime = 600; //封禁时间,超时自动解封(秒)
    16. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
    17. $uri = $_SERVER['PHP_SELF'];
    18. $cache = new Memcached();
    19. $cache->addServer('127.0.0.1', '11211') or die('memcached连接失败!');
    20. $inban = $cache->get('waf-ban-' . $ip);
    21. if ($inban) {
    22.     header("HTTP/1.1 403 Forbidden");
    23.     exit('<h1>403 Forbidden 非法访问</h1>
    24. <p>你的请求似乎不符合常理,已被服务器防火墙拦截,如有疑问请联系管理员QQ523077333</br>如果你在开发测试过程中超频被封IP,请等待' . ($bantime / 60) . '分钟后自动解封</br>你的IP:' . $ip . '</p>');
    25. }
    26. $wafarr = $cache->get('waf-' . $ip);
    27. if (!$wafarr) {
    28.     $wafarr = ['path' => $uri, 'time' => time() + $allowtime, 'sum' => 1, ];
    29.     $cache->set('waf-' . $ip, $wafarr, time() + $allowtime);
    30. } else {
    31.     if ($wafarr['sum'] > $allownum) {
    32.         $wafsum_arr = $cache->get('waf-sum-' . $ip);
    33.         if (!$wafsum_arr) {
    34.             $wafsum_arr = ['sum' => 1, ];
    35.             $cache->set('waf-sum-' . $ip, $wafsum_arr, time() + $bantime);
    36.         } else {
    37.             if ($wafsum_arr['sum'] > $allowRefresh) {
    38.                 $cache->set('waf-ban-' . $ip, 1, time() + $bantime);
    39.                 file_put_contents($fileht, $ip . "\n", FILE_APPEND);
    40.             } else {
    41.                 $wafsum_arr['sum']++;
    42.                 $cache->set('waf-sum-' . $ip, $wafsum_arr, time() + $bantime);
    43.             }
    44.         }
    45.         file_put_contents($logPath, $ip . '--' . date('Y-m-d H:i:s', time()) . '--' . $uri . "\n", FILE_APPEND);
    46.       
    47.     } else {
    48.         $wafarr['sum']++;
    49.         $cache->set('waf-' . $ip, $wafarr, $wafarr['time']);
    50.         $allowtime['refresh_times'] = 0;
    51.     $allowtime['last_time'] = $cur_time;
    52.     }
    53.    
    54. }
    复制代码

    • 可以自由设置访问频率时间,可以以月为时间长度
    • 简单易用,无论你懂不懂 PHP 开发,只要会复制粘贴就行。
    • Memcached 内存缓存技术,高性能,高并发。
    • 精准无误,0 误封。
    • 支持范围较广,直接你网站支持 PHP 就行。
    • 源码简单,可自行修改,可以套自己喜欢的前端模板主题。
    要求:
    • PHP 版本 ≥ 7.2
    • PHP 需安装 Memcached 扩展
    • Memcached ≥1.6

    使用方法
    以下开源代码添加到你网站核心文件中,相当于你网站任何页面都会引用的一个文件,类似于:config.php
    WordPress 网站添加到根目录的 /index.php 头部即可,即控制所有的页面访问,如果想要控制单独某个页面,只需要将此代码放到此页面的 PHP 内即可。
    其他 PHP 网站根据你的程序逻辑决定。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|天天站

    GMT+8, 2024-5-14 06:57 , Processed in 0.090728 second(s), 19 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.