QQ登录

只需一步,快速开始

终极精品

查看: 1108|回复: 0
打印 上一主题 下一主题

[信息安全] PHP访问频率限制,防CC攻击,支持上万并发

[复制链接]
[至尊红钻3级]发帖数量≥1000篇 [至尊黄钻5级]威望≥3000点 [至尊蓝钻3级]在线时间≥800小时 [至尊绿钻5级]贡献度≥3000点 [至尊紫钻6级]金币≥200000个 [未点亮至尊粉钻]精华贴数不足10贴 [未点亮至尊黑钻]活跃不足8个
 等级: 
 级别: 管理员
 UID:  1   [未点亮普号显示]钻石不足3个
 积 分: 407416
 威 望: 3806
 贡 献: 3745
 活 跃: 0
 发 贴: 1401 (4)
 终极币: 394653  
性 别: I'm 火星人!
阅读权限: 200
在线时长: 1151 小时
注册时间: 2014-7-25
最后登录: 2025-4-29
go
楼主
发表于 2021-11-11 23:25:14 |只看该作者 |倒序浏览

查看完整版请注册登录浏览

您需要 登录 才可以下载或查看,没有帐号?点击注册

x
由于自己的API平台经常被频繁请求,还偶尔被CC攻击,所以自己开发出了一套防止非正常高频率请求和防止一般CC攻击的PHP版本。
优势:
  • 简单易用,无论你懂不懂PHP开发,只要会复制粘贴就行。
  • Memcached内存缓存技术,高性能,高并发。
  • 精准无误,0误封。
  • 能防护QPS10000以内的CC攻击,看机器配置,有可能更高。
  • 支持范围较广,直接你网站支持PHP就行。
  • 源码简单,可自行修改,可以套自己喜欢的前端模板主题。
要求:
  • PHP版本 ≥ 7.2
  • PHP需安装Memcached扩展
  • Memcached ≥1.6
使用方法
以下开源代码添加到你网站核心文件中,相当于你网站任何页面都会引用的一个文件。类似于:config.php
WordPress网站添加到根目录的/index.php头部即可。
其他PHP网站根据你的程序逻辑决定。
开源代码
  1. <?php

  2. /**
  3. * 防止频繁请求,防范CC攻击,支持上万并发
  4. * 原创作者:小伟
  5. * 转载请保留版权,谢谢!
  6. */
  7. ini_set("display_errors", "Off");
  8. error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
  9. extension_loaded('memcached') or die('memcached扩展未安装!');

  10. $logPath = $_SERVER['DOCUMENT_ROOT'] . '/waf/waf.log'; //日志记录文件保存路径,$_SERVER['DOCUMENT_ROOT']是网站根目录
  11. $fileht = $_SERVER['DOCUMENT_ROOT'] . '/waf/ban.log'; //被拉黑IP记录文件保存路径
  12. if (!file_exists($logPath)) {
  13. @mkdir($_SERVER['DOCUMENT_ROOT'] . '/waf/', 0777, true);
  14. @file_put_contents($logPath, '');
  15. @file_put_contents($fileht, '');
  16. }
  17. $allowtime = 2; //防刷新时间(秒)
  18. $allownum = 5; //防刷新次数(比如2秒5次,超过就警告)
  19. $allowRefresh = 10; //在此警告次数之后拉黑IP
  20. $bantime = 600; //封禁时间,超时自动解封(秒)

  21. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
  22. $uri = $_SERVER['PHP_SELF'];
  23. $cache = new Memcached();
  24. $cache->addServer('127.0.0.1', '11211') or die('memcached连接失败!');
  25. $inban = $cache->get('waf-ban-' . $ip);
  26. if ($inban) {
  27. header("HTTP/1.1 403 Forbidden");
  28. exit('<h1>403 Forbidden 非法访问</h1>
  29. <p>你的请求似乎不符合常理,已被服务器防火墙拦截,如有疑问请联系管理员QQ523077333</br>如果你在开发测试过程中超频被封IP,请等待' . ($bantime / 60) . '分钟后自动解封</br>你的IP:' . $ip . '</p>');
  30. }
  31. $wafarr = $cache->get('waf-' . $ip);
  32. if (!$wafarr) {
  33. $wafarr = [
  34. 'path' => $uri,
  35. 'time' => time() + $allowtime,
  36. 'sum' => 1,
  37. ];
  38. $cache->set('waf-' . $ip, $wafarr, time() + $allowtime);
  39. } else {
  40. if ($wafarr['sum'] > $allownum) {
  41. $wafsum_arr = $cache->get('waf-sum-' . $ip);
  42. if (!$wafsum_arr) {
  43. $wafsum_arr = [
  44. 'sum' => 1,
  45. ];
  46. $cache->set('waf-sum-' . $ip, $wafsum_arr, time() + $bantime);
  47. } else {
  48. if ($wafsum_arr['sum'] > $allowRefresh) {
  49. $cache->set('waf-ban-' . $ip, 1, time() + $bantime);
  50. file_put_contents($fileht, $ip . "\n", FILE_APPEND);
  51. } else {
  52. $wafsum_arr['sum']++;
  53. $cache->set('waf-sum-' . $ip, $wafsum_arr, time() + $bantime);
  54. }
  55. }
  56. file_put_contents($logPath, $ip . '--' . date('Y-m-d H:i:s', time()) . '--' . $uri . "\n", FILE_APPEND);
  57. header("HTTP/1.1 403 Forbidden");
  58. exit("请求频率QPS超过限制,请酌情访问,多次提醒后会封禁IP!");
  59. } else {
  60. $wafarr['sum']++;
  61. $cache->set('waf-' . $ip, $wafarr, $wafarr['time']);
  62. }
  63. }
复制代码



分享到: QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏0 支持支持0 反对反对0
宣传推广终极精品资源www.chnspy.com提升下载权限1...
您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

QQ|Archiver|手机版|小黑屋|终极精品资源 ( 版权所有:广州汉鸿信息科技有限公司 粤ICP备15041466号

GMT+8, 2025-5-8 23:41 , Processed in 0.140834 second(s), 29 queries .

Powered by Discuz! X3.2

© 2015-2016 www.chnspy.com.

快速回复 返回顶部 返回列表