酷秀博客
首页/PHP基于SESSION的简单访问频率管控系统A I

PHP基于SESSION的简单访问频率管控系统

admin的头像admin3个月前A I101热度

PHP访问频率管控系统 使用文档

一、系统概述

该系统是一套基于PHP原生开发的访问频率管控解决方案,核心实现「IP+Session双重校验」「动态时段阈值」「弹窗校验+恶意行为拉黑」全流程管控,可有效防止恶意高频访问、刷接口等行为,适配单机/小型集群场景,无需依赖第三方组件,开箱即用。

核心功能清单

| 功能模块 | 核心能力 |
|----------|----------|
| IP维度管控 | 基于真实IP隔离访问状态,防止单IP多Session绕过限制 |
| 动态阈值 | 按高峰/平峰/低峰时段自动匹配不同访问阈值 |
| 分层校验 | 未校验严格限流→触发弹窗→校验通过提升阈值→二次超限封禁 |
| 恶意行为拉黑 | 弹窗校验错误次数耗尽/弹窗期间高频刷新→直接拉黑IP |
| 状态自动清理 | Session有效期管控,自动回收过期IP数据,避免性能损耗 |

二、部署与环境要求

1. 环境要求

  • PHP版本:≥5.6(推荐7.4+)
  • 扩展依赖:无需额外扩展(Session、时间函数为PHP内置)
  • 服务器环境:Apache/Nginx/IIS均可,需开启Session支持
  • 适配场景:单机部署(集群需将Session迁移至Redis)

    2. 部署步骤

  1. 将完整代码保存为.php文件(如access_control.php),上传至PHP运行环境目录;
  2. 直接访问该文件URL即可生效(无需数据库配置、无需额外依赖);
  3. (可选)若需集成到现有业务,将核心管控逻辑复制到业务页面头部即可。

    3. 部署代码


    嘿嘿嘿,此处的内容需要评论回复后方可查看。


    ## 三、核心配置说明
    所有可配置项集中在代码顶部`$config`数组,按需调整即可,关键配置说明如下:

    ```php
    $config = [
    // 基础管控时长
    'ban_time' => 300, // 普通封禁时长(秒),默认5分钟
    'blacklist_time' => 3600, // 恶意拉黑时长(秒),默认1小时
    // 校验相关配置
    'verify_fail_limit'=> 5, // 校验失败最大次数(超限拉黑)
    'popup_refresh_limit' => 10, // 弹窗期间无校验刷新阈值(超限拉黑)
    'popup_refresh_time' => 60, // 弹窗刷新统计窗口(秒)
    // 动态时段阈值规则(可新增/修改时段)
    'dynamic_rules' => [
    // 高峰时段(示例:09:00-12:00)
    [
    'start_time' => '09:00', // 时段开始时间(24小时制)
    'end_time' => '12:00', // 时段结束时间
    'unverified_limit' => 3, // 未校验状态访问阈值(次)
    'unverified_time' => 60, // 未校验时间窗口(秒)
    'verified_limit' => 15, // 校验通过后访问阈值(次)
    'verified_time' => 60, // 校验通过时间窗口(秒)
    ],
    // 可新增/删除时段规则,按数组顺序优先匹配
    ]
    ];
    ```

    ### 4. 相关截图展示,(注意验证码什么的需要自己替换成动态的)

    ![QQ20251227-170307.png](https://pic2.ziyuan.wang/user/xunm/2025/12/QQ20251227-170307_392f26c05e153.png)
    ![QQ20251227-173607.png](https://pic2.ziyuan.wang/user/xunm/2025/12/QQ20251227-173607_ca4112ad7cc5d.png)
    ![QQ20251227-173620.png](https://pic2.ziyuan.wang/user/xunm/2025/12/QQ20251227-173620_b8da04160ddc3.png)
    ![QQ20251227-170327.png](https://pic2.ziyuan.wang/user/xunm/2025/12/QQ20251227-170327_db16c50e43c61.png)

    ### 配置调整建议
  • 高峰时段(如09:00-12:00、14:00-18:00):降低unverified_limit(如3次),严控未校验访问;
  • 低峰时段(如22:00-09:00):提高unverified_limit(如8次),提升用户体验;
  • 高安全需求场景:缩短popup_refresh_time(如30秒)、降低popup_refresh_limit(如5次),严控恶意刷新;
  • 测试环境:可将ban_time/blacklist_time设为10秒,便于快速验证逻辑。

    四、功能使用与验证

    1. 正常访问流程

  1. 访问页面→系统识别IP+当前时段→未触发阈值→展示正常内容;
  2. 多次刷新→达到「未校验阈值」→弹出校验弹窗;
  3. 输入正确校验码(测试码:1234)→校验通过→提升访问阈值→正常访问;
  4. 校验通过后再次高频访问→达到「已校验阈值」→触发普通封禁(5分钟)。

    2. 恶意行为管控验证

    | 恶意行为 | 触发条件 | 管控结果 |
    |----------|----------|----------|
    | 校验码多次错误 | 连续输入错误码≥5次 | IP被拉黑1小时 |
    | 弹窗期间高频刷新 | 弹窗展示后无校验提交,60秒内刷新≥10次 | IP被拉黑1小时 |
    | 普通高频访问 | 校验通过后仍超限 | 普通封禁5分钟 |

    3. 页面展示信息说明

  • 正常访问页:展示当前IP、时段、访问状态、已访问次数/阈值;
  • 封禁页:展示封禁IP、剩余解封时间;
  • 拉黑页:展示拉黑IP、剩余拉黑时间;
  • 校验弹窗:展示IP、剩余尝试次数、剩余可刷新次数。

    五、扩展与定制开发

    1. 替换真实校验逻辑(核心优化)

    当前为模拟校验(固定码1234),建议替换为图形验证码/滑块验证,步骤如下:

  1. 集成PHP GD库生成图形验证码,将验证码存储到Session;
  2. 修改POST校验逻辑:对比用户输入码与Session中存储的验证码;
  3. 移除固定校验码1234,实现动态验证码校验。

    2. 适配集群场景

    单机Session无法跨节点共享,集群部署需将Session迁移至Redis:

  4. 安装PHP Redis扩展;
  5. 修改Session存储方式:
    
    // 代码开头添加<br />
    ini_set('session.save_handler', 'redis');<br />
    ini_set('session.save_path', 'tcp://127.0.0.1:6379');<br />
    ```<br />
  6. 所有IP相关状态将存储到Redis,实现跨节点共享。

    3. 新增IP白名单

    getRealIp()函数后添加白名单逻辑:

    
    // 定义白名单IP数组<br />
    $whiteList = ['192.168.1.100', '127.0.0.1'];<br />
    if (in_array($realIp, $whiteList)) {<br />
     // 白名单IP直接放行,跳过所有管控逻辑<br />
     echo "白名单IP访问";<br />
     exit;<br />
    }<br />
    ```<br />
    <br />
    ### 4. 日志持久化<br />
    如需记录访问/封禁/拉黑日志,可在对应逻辑处添加日志写入:<br />
    ```php<br />
    // 示例:拉黑时记录日志<br />
    $logContent = date('Y-m-d H:i:s') . " - IP:{$realIp} - 拉黑原因:弹窗刷新超限\n";<br />
    file_put_contents('access_blacklist.log', $logContent, FILE_APPEND);<br />
    ```<br />
    <br />
    ## 六、常见问题排查<br />
    ### 1. IP识别错误<br />
  • 现象:封禁/拉黑IP非真实客户端IP;
  • 原因:服务器部署了反向代理/CDN,未获取到真实IP;
  • 解决:getRealIp()函数已兼容常见代理场景,若仍错误,补充对应代理头(如HTTP_X_REAL_IP)。

    2. 跨天时段阈值不生效

  • 现象:22:00-09:00时段阈值未按配置生效;
  • 原因:服务器时间与本地时间不一致;
  • 解决:同步服务器系统时间,确保date()函数返回正确时间。

    3. Session数据累积过多

  • 现象:服务器Session文件过多/Redis内存占用高;
  • 解决:已配置session.gc_maxlifetime=7200秒,系统会自动清理2小时过期数据,无需手动处理。

    七、核心逻辑流程图

    
    graph TD<br />
      A[用户访问] --> B{获取真实IP}<br />
      B --> C{是否拉黑}<br />
      C -- 是 --> D[展示拉黑提示]<br />
      C -- 否 --> E{是否普通封禁}<br />
      E -- 是 --> F[展示封禁提示]<br />
      E -- 否 --> G{匹配动态时段阈值}<br />
      G --> H{是否触发未校验阈值}<br />
      H -- 否 --> I[正常访问]<br />
      H -- 是 --> J{弹窗期间是否高频刷新}<br />
      J -- 是 --> K[拉黑IP]<br />
      J -- 否 --> L[展示校验弹窗]<br />
      L --> M{校验是否通过}<br />
      M -- 否 --> N{失败次数是否超限}<br />
      N -- 是 --> K<br />
      N -- 否 --> L<br />
      M -- 是 --> O[提升访问阈值]<br />
      O --> P{是否触发已校验阈值}<br />
      P -- 是 --> F<br />
      P -- 否 --> I<br />
    ```<br />
    <br />
    ## 八、总结<br />
    ### 核心优势<br />
  1. 零依赖:基于PHP原生开发,无需数据库/第三方组件,部署成本低;
  2. 高安全:IP+Session双重管控,恶意行为精准拉黑,防绕过;
  3. 灵活性:动态时段阈值,可按需适配不同业务高峰场景;
  4. 易扩展:支持图形验证码、Redis集群、IP白名单等定制开发。

    注意事项

  5. 生产环境务必替换模拟校验为真实验证码,避免固定码被破解;
  6. 定期清理日志文件(若开启日志持久化),避免磁盘占用过高;
  7. 集群部署需确保Session共享,否则多节点管控会失效。
签名: 最忠诚的BUG开发者来自: 重庆市. 火狐浏览器
文章目录