【网站安全】API被批量爆破和爬虫?使用Redis来封禁高频访问IP!

为什么不用Mysql来做?

MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取需要IO操作,所以速度较慢

Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限

代码实现:

代码转载自:https://guihet.com/redisip.html

1.新建一个文件IPRestrict.php

<?php
/**
 * PHP实现redis限制单ip、单用户的访问次数功能
**/
 
class IPRestrict {
    /**
     * @var Redis
     */
 
    private static $redis;
    /**
     * @var string
     * 取客户端真实ip地址作为key
     */
 
    private static $realip;
  
    public function __construct($host = '127.0.0.1', $port = 6379, $auth = null) {
        self::$redis = new Redis();
        self::$redis->connect('127.0.0.1', 6379);
        $auth && self::$redis->auth($auth);
        self::$realip = self::getRealIP();
    }
  
    /**
     * 取得客户端IP地址
     * @return string
     */
 
    public static function getRealIP() {
        $realip = "";
        if (isset($_SERVER)) {
            foreach(['HTTP_X_FORWARED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'] as $name) {
                if (isset($_SERVER[$name])) {
                    $realip = $_SERVER[$name];
                    break;
                }
            }
        } else {
            $realip = getenv('HTTP_X_FORWARDED_FOR') || getenv('HTTP_CLIENT_IP') || getenv('REMOTE_ADDR');
        }
        return $realip;
    }
  
    /**
     * 记录该ip的访问次数 也可改成用户id
     * @param int $limit  限制指定时间内的访问磁珠
     * @param int $time  限制时间为60秒
     * @return int
     * @throws HttpException
     */
 
    public function requestCount($limit = 120, $time = 60) {
        $key = self::$realip;
        $redis = self::$redis;
        /**
         * @var bool
         */
 
        $exists = $redis->exists($key);
        $redis->incr($key);
  
        if ($exists) {
            $count = $redis->get($key);
            if ($count > $limit) {
                die('请求太频繁,请稍后再试!'.$count);
            }
        } else {
            // 首次计数 设定过期时间
            $redis->expire($key, $time);
        }
  
        // return $redis->get($key);
    }
}
?>

2.在你需要限制的API文件内加上

<?php
include 'IPRestrict.php';
 
$restrict = new IPRestrict();
echo $restrict->requestCount();
?>
温馨提示: 本文最后更新于2024-02-04 17:40:07,某些文章具有时效性,若有错误或已失效,请在下方 留言或联系 沐光橙香
© 版权声明
THE END
喜欢就支持一下吧
点赞14赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容