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

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

为什么不用Mysql来做?

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

Redis是N󠄐󠄹󠅀󠄪󠄢󠄡󠄦󠄞󠄧󠄣󠄞󠄢󠄡󠄦󠄞󠄡󠄠󠄧󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄐󠄹󠅀󠄪󠄢󠄡󠄦󠄞󠄧󠄣󠄞󠄢󠄡󠄦󠄞󠄡󠄠󠄧󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄐󠄹󠅀󠄪󠄢󠄡󠄦󠄞󠄧󠄣󠄞󠄢󠄡󠄦󠄞󠄡󠄠󠄧󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄐󠄹󠅀󠄪󠄢󠄡󠄦󠄞󠄧󠄣󠄞󠄢󠄡󠄦󠄞󠄡󠄠󠄧󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄥󠄦󠄥󠄦󠄩󠄦󠄥󠄨󠄬󠅒󠅢󠄟󠄮󠄥󠄦󠄥󠄦󠄩󠄦󠄥󠄨󠄬󠅒󠅢󠄟󠄮󠄡󠄧󠄥󠄦󠄥󠄦󠄩󠄦󠄥󠄨󠄬󠅒󠅢󠄟󠄮󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄥󠄦󠄥󠄦󠄩󠄦󠄥󠄨󠄬󠅒󠅢󠄟󠄮OSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保󠄐󠄹󠅀󠄪󠄢󠄡󠄦󠄞󠄧󠄣󠄞󠄢󠄡󠄦󠄞󠄡󠄠󠄧󠄬󠅒󠅢󠄟󠄮󠄐󠅅󠄹󠄴󠄪󠄾󠅟󠅤󠄐󠄼󠅟󠅗󠅙󠅞󠄬󠅒󠅢󠄟󠄮󠅄󠅙󠅝󠅕󠄪󠄡󠄧󠄥󠄦󠄥󠄦󠄩󠄦󠄥󠄨󠄬󠅒󠅢󠄟󠄮存时间有限

代码实现:

代码转载自: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();
?>

温馨提示: 本文最后更新于2025-08-01 00:44:17,某些文章具有时效性,若有错误或已失效,请在下方 留言或联系 沐光橙香
© 版权声明
THE END
喜欢就支持一下吧
点赞592赞赏 分享
评论 共1条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片